# Enter Taste abfangen



## Guest (28. Mrz 2008)

Hallo,

habe eine Methode geschrieben um meine Componenten zu initalisieren:

```
private void initComponent(JFrame f,Component c)
	{
		c.addKeyListener( new KeyListener() 
		{ 
			public void keyTyped( KeyEvent e ) { 
				if ( e.getKeyChar() == KeyEvent.CHAR_UNDEFINED ) 
				{ 
					if ( e.getKeyCode() == KeyEvent.VK_ENTER ) 
					{
						System.out.println("Text");
					}
				}
			} 

			public void keyPressed( KeyEvent e ) {} 
			public void keyReleased( KeyEvent e ) {}


		});
```

Ich will nur eine Nachricht bekommen wenn jemand "Enter drückt".
Warum funktioniert es nicht?


----------



## MiDniGG (28. Mrz 2008)

lass das

if ( e.getKeyChar() == KeyEvent.CHAR_UNDEFINED ) 

ma weg


----------



## Guest (28. Mrz 2008)

da tut sich immer noch nichts...


----------



## manuche (28. Mrz 2008)

und wenn es dann nicht geht ein c.requestfocus() ans ende deiner methode bzw nach dem methoden aufruf...


----------



## MiDniGG (28. Mrz 2008)

Ja Klar. Die Komponente die den KeyListener verwendet sollte schon den Fokus haben...
Falls es nicht so geht wie du willst. Einfach mal jeder einzelnen Komponente den KeyListener zuweisen. ;-)


----------



## Michael... (28. Mrz 2008)

laut Doku liefert getKeyCode in diesem Fall immer VK_UNDEFINED
ich würde es also mal mit e.getKeyChar() == KeyEvent.VK_ENTER versuchen


> getKeyCode
> public int getKeyCode()Returns the integer keyCode associated with the key in this event.
> Returns:
> the integer code for an actual key on the keyboard. (For KEY_TYPED events, the keyCode is VK_UNDEFINED.)


----------



## dirty-mg (28. Mrz 2008)

Folgender Vorschlag dürfte auch funktionieren:


```
public class MyFrame extends JFrame implements AWTEventListener {

    public MyFrame() {
        // init GUI ...

        Toolkit tk = Toolkit.getDefaultToolkit();
        tk.addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
    }

    public void eventDispatched(AWTEvent event) {
        if (event instanceof KeyEvent) {
            KeyEvent ke = (KeyEvent) event;
            // wird ENTER gedrückt, schließt sich das Fenster
            if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
                // mache irgendwas ...
            }
        }
    }
}
```

Dabei hast Du den Vorteil, dass ENTER "erkannt" wird, unabhängig davon, welche Komponente im Fentser gerade den Fokus hat.

mfg
Marcus


----------



## manuche (28. Mrz 2008)

ansonsten kannst du deinen code auch in keyPressed legen...
Dass ignoriert zwar, dass die Taste losgelassen wird aber springt trotzdem auf den Tastendruck an!


----------



## dirty-mg (28. Mrz 2008)

kommt halt drauf an, ob nur bei einigen Komponenten oder generell im Fenster auf ENTER gehört werden soll. Meine Lösung habe ich mal gebaut, als ich ein Fenster beim Drücken von ESCAPE schließen wollte. Da wäre es ja Quatsch, dass jede einzelne Komponente auf ENTER hört.


----------



## Beni (28. Mrz 2008)

Wenn du mit Swing arbeitest, solltest du dir auchmal überlegen, die InputMap und ActionMap zu verwenden. Damit wird der Tastendruck (oder auch mehrere) automatisch abgefangen und eine Aktion ausgeführt.


----------



## dirty-mg (28. Mrz 2008)

Hey Beni,

Erklär mal kurz InputMap und ActionMap ...
Hab ich noch nicht gehört.

Danke
Marcus


----------



## Beni (28. Mrz 2008)

Ziemlich einfach: die InputMap verbinded ein KeyStroke (eine Tastenkombination) mit einem Schlüssel, und die ActionMap den Schlüssel mit einer Action. Wenn die Tastenkombination gedrückt wird, wird die Aktion ausgeführt.

Z.B. hier wenn man "ctrl + a" oder "Enter" drückt, und der Button fokusiert ist.

```
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;


public class Test {
    public static void main( String[] args ) throws Exception{
        JFrame frame = new JFrame( "Demo" );
        JButton button = new JButton( "Button" );
        frame.add( button );
        
        InputMap input = button.getInputMap( JComponent.WHEN_FOCUSED );
        ActionMap action = button.getActionMap();
        
        input.put( KeyStroke.getKeyStroke( "control A" ), "kabum" );
        input.put( KeyStroke.getKeyStroke( KeyEvent.VK_ENTER, 0 ), "kabum" );
        
        action.put( "kabum", new AbstractAction(){
            public void actionPerformed( ActionEvent e ) {
                System.out.println( "RabadabaBUM" );
            }
        });

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setBounds( 20, 20, 200, 200 );
        frame.setVisible( true );
    }
}
```

Es gibt mehr als eine InputMap, z.B. auch eine die wirkt wenn die Component den Fokus nicht hat.


----------

