Enter Taste abfangen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

habe eine Methode geschrieben um meine Componenten zu initalisieren:
Code:
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?
 
lass das

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

ma weg
 
und wenn es dann nicht geht ein c.requestfocus() ans ende deiner methode bzw nach dem methoden aufruf...
 
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. ;-)
 
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.)
 
Folgender Vorschlag dürfte auch funktionieren:

Code:
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
 
ansonsten kannst du deinen code auch in keyPressed legen...
Dass ignoriert zwar, dass die Taste losgelassen wird aber springt trotzdem auf den Tastendruck an!
 
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.
 
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.
 
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.
Code:
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben