Announcement

Collapse
No announcement yet.

Event-Handling

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Event-Handling

    Hallo,

    ich möchte gerne aus einem Frame heraus mit ESC den Frame beenden. Unabhängig davon wo ich mich gerade befinde (z.B. in einem TextFeld).

    vielleicht kann mir jemand ein Code Fragment senden

    vielen Dank schon mal
    Gruß
    Orhan

  • #2
    Hallo,

    wenn Du von JDialog, JFrame erbst sollte der folgende Quelltext funktionieren... (einfach Methode einfügen).

    <pre>
    protected JRootPane createRootPane()
    {
    JRootPane rootPane = super.createRootPane();

    KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
    rootPane.registerKeyboardAction(
    new ActionListener() {
    public void actionPerformed(ActionEvent e) { cancelPressed(); }
    },
    stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);

    return rootPane;
    }
    </pre>

    besten Dank an Frank (FU) für den Tip,<br>
    Viele Grüße,<br>
    Andrea

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für die Antwort, aber es funktioniert leider nicht.
      im grunde genommen habe einfach ein Frame abgeleitet von JFrame
      das Frame enthält eingabefelder. wenn ich mich in einem Eingabefld befinde und ESC drücke, dann passiert nichts. Wenn ich allerdings
      keine Componenten auf dem Frame habe funktioniert dein Code Beispiel.

      gruß

      orha

      Comment


      • #4
        Hallo zusammen,

        Andreas's Vorschlag sollte ab JDK 1.3 nicht mehr verwendet werden
        (siehe Beschreibung der Methode registerKeyboarAction(...)).

        Daher mein Vorschlag:

        Implementiere das Action Interface

        <pre>

        Action action = new AbstractAction("EXIT")
        {
        public void actionPerformed(ActionEvent e)
        {
        System.exit(0);
        }
        };
        </pre>

        Weise nun allen Komponenten die auf Escape reagiren sollen
        das Tastaturereignis mithilfe folgender Methode zu:

        <pre>
        private void connectWithAction(JComponent c, Action a)
        {
        Object name = a.getValue(Action.NAME);
        c.getActionMap().put(name, a);
        c.getInputMap().put(KeyStroke.getKeyStroke(KeyEven t.VK_ESCAPE, 0), name);
        }
        </pre>

        Beispiel:
        JButton b = new JButton();
        connectWithAction(b, action);

        Hinweis:

        Das Panel in dem sich die Komponenten befinden wird trotz Zuweisung
        nicht reagieren, da es keinen Fokus empfängt. Wenn dies gewünscht ist,
        dann füge dem Panel einen Mauslistener hinzu in dem bei mouseClicked
        requestFocus() des Panels aufgerufen wird.

        Viel Spass

        Thoma

        Comment


        • #5
          Hallo,

          ja ab/bei 1.3 ist das Beispiel von Thomas besser. Wenn Du noch Focus Probleme hast versuche mal getInputMap() mit getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
          <pre>
          // im Frame (Bsp.: Constructor)
          ActionMap am = getRootPane().getActionMap();
          InputMap im = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUS ED_WINDOW);

          KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);

          im.put(stroke, "MY_ESC"); // Name als Konstante :-)
          am.put("MY_ESC", new AbstractAction() {
          public void actionPerformed(ActionEvent e) { System.out.println("ESCAPE"); };
          });
          </pre>

          zu ersetzen.<br>
          Viele Grüße,<br>
          Andrea

          Comment


          • #6
            Hallo Thomas,

            danke für den Tip, hat funktioniert.

            gruß

            orha

            Comment

            Working...
            X