# KeyEvent in JButton?



## zickzack0312 (23. Feb 2005)

Hallo, 

eine einfache Frage: Wie soll ich das implementieren, dass einen JButton durch Drücken "Return" Key  gleichwirkend gedrückt wird.



```
JPanel jp = new JPanel();
JButton b =  new JButton("Enter");
jp.add(b);
jp.addKeyListener(new KeyLister());

.........................................
class KeyListener extends KeyAdapter {
						 
		public void keyPressed(KeyEvent e) {
			if (e.getSource() == KeyEvent.VK_ENTER)
                        {.............}  // was soll hier rein
```


----------



## Illuvatar (23. Feb 2005)

Wie wärs mit

```
b.doClick();
```


----------



## zickzack0312 (23. Feb 2005)

danke erstmal.  Es funktioniert aber nicht, dh. es macht nichts wenn ich "Return" drücke.  Ich weiss nicht ob ich irgendwo einen Fehler gemacht habe. Die Code sieht so aus:


```
class JP extends JPanel{

private JButton b;

public JP(){
b =  new JButton("Enter");
this.add(b);
this.addKeyListener(new KeyLister());
....................................
b.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{...............}});


   }
.........................................
  class KeyListener extends KeyAdapter {
                  
      public void keyPressed(KeyEvent e) {
         if (e.getSource() == KeyEvent.VK_ENTER)
                        {b.doClick();
         }}}  



}
```


----------



## Illuvatar (23. Feb 2005)

Mir fällt nix auf was falsch ist, bloß: du machst addKeyListener(new KeyLister()), aber deine Klasse unten heißt KeyListener ???:L


----------



## L-ectron-X (23. Feb 2005)

Es funktioniert nicht... na so was! :? 
Wie wär's mit einer Fehlermeldung?


----------



## zickzack0312 (23. Feb 2005)

Ich habe keine Fehlermeldung bekommen.  Das addKeyListener(*new KeyLister()*) war Eintippsfehler  :wink:


----------



## nagash56 (23. Feb 2005)

Vielleicht funktioniert es, wenn du nicht dem JPanel den Listener hinzufügst sondern einer höher geordneten Komponente in dem das Panel ist (JDialog, JFrame), die auch den Focus für KeyEvents haben *shrug*


----------



## zickzack0312 (23. Feb 2005)

habe ausprobiert, geht aber nicht, komisch............


----------



## Beni (23. Feb 2005)

```
(e.getSource() == KeyEvent.VK_ENTER)
```
Diese Bedingung wird nie angesprochen: denn die Source ist die Komponente, welche den Fokus hatte, als die Taste gedrückt wurde (das ist was anderes als der KeyCode :wink: )

Versuch mal

```
(e.getKeyCode() == KeyEvent.VK_ENTER)
```


Und: immer die Komponente, welche den Fokus besitzt, bekommt das Event, die anderen nicht.
Du musst also alle Komponenten deines Dialoges/Frames abhören, wenn das universell funktioniern soll.


----------



## zickzack0312 (24. Feb 2005)

sorry, das e.getSource() habe ich früher schon geändert,  aber es funktioniert trotzdem nicht. und dein Vorschlag habe ich auch nicht ganz verstanden. Die Struktur meines Programms sieht etwa so:

JButton---->JPanel0---->JTabbedPane---->JPanel---->JFrame  

wer besitzt den Focus? wo muss ich den Listener einsetzen?


----------



## Beni (24. Feb 2005)

Der Focus besitzt diejenige Component, auf welcher du arbeitest. Wenn du z.B. auf einen Knopf drückst, besitzt der Knopf den Focus. Wenn du auf ein Textfeld drückst (und in ihm schreibst), besitzt das Textfeld den Focus.
-> Jede Component auf deinem Frame kann den Focus besitzen, und welche es tatsächlich ist, wechselt die ganze Zeit.
-> Der Listener muss bei jeder Component angemeldet werden (nicht nur bei den Parentcomponents deines Buttons!)


----------



## zickzack0312 (24. Feb 2005)

danke Beni, ich habe es geklappt.


----------



## flanker (24. Feb 2005)

Hier eine etwas andere Lösung, mir gefäht so besser:


```
Action action = getAction("ActionKeyInMap");
button.addActionListener(action);
button.registerKeyboardAction(action,
                                             KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
                                             JButton.WHEN_IN_FOCUSED_WINDOW);
```

Ich denke, grundsätzlich ist es besser, wenn die Actions in
einem Pool (Map etc.)  gehalten werden, denn eine Action kann 
wiederverwendet werden, z.B.: im JMenuItem.


----------

