Swing Tastaturereignisse auf gesamten Frame Abfangen

Pacman92

Mitglied
Hallo,

ich habe einen JFrame mit mehreren Buttons / Labeln etc ...

Jetzt will ich, dass egal welches Element den Focus hat, dass ich Tastatureingaben wie einen Nummer oder auch Tastenkombinationen wie Strg + X abfangen kann.

Ist dies überhaupt möglich ??

Schonmal danke für eure Hilfe
 
Ok danke soweit ist es mir klar,

aber ich denke ich habe hier noch einen Denkfehler. Ich kann doch jetzt nicht direkt ein KeyBinding auf den JFrame machen oder? Ich will ja alle Ereignisse für diesen JFrame abfangen
 
Schuldigung aber ich glaub ich stell mich einfach zu hacke an 🙁

Die KeyBindings kann ich ja nur an eine JComponent festmachen und das Ereigniss wird ausgelöst, wenn die Komponente den Fokus hat oder eine darunterliegende Komponente (habe ich das richtig verstanden?)

Jetzt habe ich aber den Fall das wenn zum Beispiel der Fokus auf BTN1 liegt und ich die 0 drück in LBL1 was reingeschrieben werden soll, in diesem Fall würde ich die KeyBinding ja auf dem Frame brauchen aber das geht ja nicht.

Habe ich irgendwas falsch verstanden??
 
Das wird doch in dem Abschnitt alles erklärt :bahnhof:

Java:
    public static void main(String[] args) {
        JFrame frame = new JFrame("Keybindings");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));

        JButton btn1 = new JButton("Mooeeep");
        JButton btn2 = new JButton("Mooeeep2");
        JButton btn3 = new JButton("Mooeeep3");
        final JLabel lbl1 = new JLabel();
        lbl1.setPreferredSize(new Dimension(100, 16));

        btn1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("0"), "zeroPressed");
        btn1.getActionMap().put("zeroPressed", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                lbl1.setText(lbl1.getText() + "0");
            }
        });

        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(lbl1);
        frame.pack();
        frame.setVisible(true);
    }
Kann man bestimmt besser machen, hab auch noch nie damit gearbeitet. Aber das hab ich schnell aus dem Beispielcode der Seite zusammengeschrieben
 
Der KeyListener funktioniert nur wenn der JFrame dann auch den Fokus hat. Platzierst du aber z.b. nen Button auf den frame dann hat der Button den Fokus 😉
 
Das funktioniert aber trotzdem doch nur wenn der jeweilige Button in dem Fall btn1 den Fokus hat. Das heist ich müsste diese Keymap für jeden Button registrieren, daher jetzt meine Frage ob man das irgendwie vereinfachen kann oder ob ich es wirklich so machen muss ....

Das wird doch in dem Abschnitt alles erklärt :bahnhof:

Java:
    public static void main(String[] args) {
        JFrame frame = new JFrame("Keybindings");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));

        JButton btn1 = new JButton("Mooeeep");
        JButton btn2 = new JButton("Mooeeep2");
        JButton btn3 = new JButton("Mooeeep3");
        final JLabel lbl1 = new JLabel();
        lbl1.setPreferredSize(new Dimension(100, 16));

        btn1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("0"), "zeroPressed");
        btn1.getActionMap().put("zeroPressed", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                lbl1.setText(lbl1.getText() + "0");
            }
        });

        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(lbl1);
        frame.pack();
        frame.setVisible(true);
    }
Kann man bestimmt besser machen, hab auch noch nie damit gearbeitet. Aber das hab ich schnell aus dem Beispielcode der Seite zusammengeschrieben
 
Das funktioniert aber trotzdem doch nur wenn der jeweilige Button in dem Fall btn1 den Fokus hat. Das heist ich müsste diese Keymap für jeden Button registrieren, daher jetzt meine Frage ob man das irgendwie vereinfachen kann oder ob ich es wirklich so machen muss ....

Nö eben nicht das ist ein Hot key der funktioniert auch wenn btn1 den Focus NICHT hat...

mach dir eine eigene Komponente die von JButton erbt und benutz die...
 
Du ich glaub ich stell mich einfach zu blöde an ....

Mit der Vererbung ist mir schon klar aber ich bekomm das halt einfach nicht auf diesem Fall angewandt. 🙁

Ich habe jetzt auch noch mal nach Beispielen gesucht, damit ich es vieleicht einfach besser verstehe, aber ich finde nix, was direkt auf meinen Fall zu trifft.

Sharing an InputMap or an ActionMap Between Two Components | Example Depot
Hier wird die KeyMap ja auch jeden Button zugewiesen und dass will ich ja gerade vermeiden
 

Zurück
Oben