KeyListener auf JFrame reagiert nicht

blz

Bekanntes Mitglied
Hallo,

ich habe ein Programm mit einem JFrame geschrieben, der in einem BorderLayout mehrere verschiedene Komponenten enthält:
Ein Panel mit Buttons, dann eins mit JTextareas usw.

Nun möchte ich dem parent-Frame einen KeyListener hinzufügen, damit z. B. ein neues JPanel an eine bestimmte Stelle gesetzt wird.
Ich nahm an, den Listener müsste ich dem Frame hinzufügen, weil der ja die übergeordnete Instanz ist und diese Tastenkombinationen ja immer funktionieren sollen.
Einen KeyListener hinzuzufügen, ist ja nun kein Hexenwerk. Allerdings funktioniert es nicht.

Gibt es ein Problem dadurch, dass immer eine der enthaltenen Komponenten im Fokus ist (also der Button, die Textarea, ...)?
Oder müsste das generell gehen?
 

SystemExit

Mitglied
ich kenne mich nicht so gut aus, aber ich denke es ist ein Fokus problem
setFocusable(true);
requestFocusInWindow();

das sollte das problem lösen, sofern du dir sicher bist dass du alles andere richtig gemacht hast, weil kein code...
aber ich will wissen, was die anderen dazu sagen...;)
 
Zuletzt bearbeitet:

blz

Bekanntes Mitglied
setFocusable(true); und requestFocusInWindow(); lösen das Problem so lange, wie ich keinen Button gedrückt habe. Danach funktioniert der KeyListener wieder nicht mehr - was mich wohl in der Annahme bestätigt, dass es ein Problem des Fokus ist:
Wenn ein Button geklickt wurde, hat er den Fokus und nicht mehr der JFrame, der den KeyListener hat.

Meine Frage ist also eher generellerer Natur:
wie muss die Architektur aussehen, wenn man eine GUI, hat, die aus verschiedenen Knöpfen, Panels, Textfields etc. besteht, damit es "globale" Tastenkombinationen gibt, die immer funktionieren (Praktisch z. B. sowas wie Strg+S für speichern), auch wenn gerade ein Button gedrückt worden ist, der dann noch den Fokus hat.
 

blz

Bekanntes Mitglied
Danke.
Hier der Code und eine Erklärungen für alle, die darüber stolpern:

Java:
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK), "DasWasPassierenSoll");
        panel.getActionMap().put("DasWasPassierenSoll", new AbstractAction() {            
            @Override
            public void actionPerformed(ActionEvent e) {
                // Das, was passieren soll
            }
        });

Das praktische an Keybindings ist, dass man nicht auf die Komponente klicken muss, damit sie den Focus hat, sondern, dass sie unabhängig davon funktionieren.

Man braucht zwei Objekte, die eine Komponente schon mitbringt, eine Input- und eine ActionMap:
Die InputMap bildet die Tastenkombination auf einen Actionnamen ab, die Action map bildet den Actionnamen auf eine tatsächliche Action ab.

Beim Tastendrücken wird dann die InputMap der Komponente durchsucht nach der gedrückten Tastenkombination und es wird der Actionname gefunden.
Dann wird die ActionMap nach dem ActionNamen durchsucht und die zugehörige Action augeführt.

Theoretisch könnte man ja nun auf die Idee kommen und sagen, warum sollte ich nicht gleich die Action in die InputMap schreiben und mir den Umweg mit dem ActionNamen sparen? Dann bräuchte man nur eine Map.
Es scheint aber so, wie es ist, besser, "objektorientierter" zu sein. Wers genauer wissen will, müsste sich selbst mit der Doku auseinandersetzen.
 

mihe7

Top Contributor
Theoretisch könnte man ja nun auf die Idee kommen und sagen, warum sollte ich nicht gleich die Action in die InputMap schreiben und mir den Umweg mit dem ActionNamen sparen?
Zum Beispiel weil eine Action nicht unbedingt mit einem Tastendruck verbunden sein muss.

Actions haben übrigens eine ganz nette Eigenschaft: man kann eine Action im Konstruktor von z. B. Buttons und Menüeinträgen verwenden. Die Action konfiguriert dann das jeweilige Element (Name, Mnemonic, Icon, ...) Der Witz: man keine eine Action enablen/disablen und das wirkt sich dann automatisch auf die jeweiligen Elemente in der erwarteten Weise aus.
 
X

Xyz1

Gast
Schon gut, normalerweise hab ich viel Phantasie (oder schaue lange in meine Kaffeetasse :D ), allerdings konnte ich mir das nicht ganz aufdröseln. Danke für die Richtigstellung ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
G JFrame,JPanel,JTextField und KeyListener AWT, Swing, JavaFX & SWT 6
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3
E KeyListener AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben