# KeyEvent für JFrame



## hey-ho (9. Jul 2008)

Hallo,

ich hab mir für meine Swing-Anwendung einen KeyListener geschrieben, der bei Drücken der Tasten STRG+N immer den Dialog zum Eingeben einer neuen Person aufrufen soll, egal, wo sich das Programm gerade befindet. Das klappt teilweise auch ganz gut, aber nur am Anfang. Später reagiert das Programm nicht mehr auf diese Tastenkombination. Wenn ich z.B. meine Tabelle anzeigen lasse geht die Tastenkombination noch, sobald ich aber in der JTable eine Zeile selektiert habe, geht STRG+N nicht mehr. Auch wenn ich einen Button gedrückt habe. Hier mal die relevanten Codeteile...


Die Startklasse:

```
public class Start {
	
	public Start() {
		
		MainFrameCommand cmd = new MainFrameCommand();
		HauptFrame hauptFrame = new HauptFrame(cmd);
		
	}


	public static void main(String[] args) {

		javax.swing.SwingUtilities.invokeLater(new Runnable() {
		      public void run() {
		    	  new Start();
		      }
	    });

	}

}
```

Mein MainFrameCommand:

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


public class MainFrameCommand
implements KeyListener
{
	
	public void keyPressed(KeyEvent event)
	{
		HauptFrame source = (HauptFrame)event.getSource();
		
		if (event.getKeyCode() == KeyEvent.VK_N && event.isControlDown()) {
			new DialogNeuePerson(source);
		}
	
	}
	
	
	public void keyReleased(KeyEvent event)
	{
		
	}
	
	
	public void keyTyped(KeyEvent event)
	{
		
	}

}
```

Und mein HauptFrame:

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class HauptFrame extends JFrame {
	
	private int width, height;

	private int x, y;

	private Dimension d;
	
	private HauptMenue hauptmenue;
	
	JPanel hauptPanel;
	
	
	
	public HauptFrame(KeyListener cmd) {
		
		setTitle("Personen");


		// Grösse des Bildschirms abfragen
		d = Toolkit.getDefaultToolkit().getScreenSize();

		// Framegrösse 9/10 vom kompletten Bildschirm
		width = d.width * 9 / 10;
		height = d.height * 9 / 10;

		// Frame auf Bildschirm zentriert
		x = (d.width / 2) - (width / 2);
		y = (d.height / 2) - (height / 2);

		setBounds(x, y, width, height);
		
		hauptPanel = new JPanel();
		hauptPanel.setLayout(new BorderLayout());
		
		add(BorderLayout.CENTER, hauptPanel);
		
		hauptmenue = new HauptMenue(this);
		setJMenuBar(hauptmenue);

		addKeyListener(cmd);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		
	}

}
```

Hab ich da irgendwas falsch gemacht? Wird der KeyListener durch irgendwas wieder "abgeschaltet". Vielleicht kann mir ja wer helfen. Danke.


----------



## dirty-mg (9. Jul 2008)

Möglicherweise hilft das weiter:


```
public class MyFrame extends JFrame implements AWTEventListener {
    public MyFrame() {
        // GUI initialisieren
        // ...
        Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
    }

    public void eventDispatched(AWTEvent event) {
        if (event instanceof KeyEvent) {
            KeyEvent ke = (KeyEvent) event;
            if (ke.getKeyCode() == KeyEvent.VK_N && ke.isControlDown()) {
                new DialogNeuePerson(source);
            } 
        }
    }
}
```

So fange ich in einem Fenster KeyEvents ab egal welche Komponente den Fokus hat.

mfg
Marcus


----------



## Gast2 (9. Jul 2008)

hier mal ein beispiel für F1

```
JComponent c = (JComponent)getContentPane();
InputMap im = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = c.getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "F1");
am.put("F1", new AbstractAction(){
  public void actionPerformed(ActionEvent e){
    System.out.println("F1 typed");
  }
});
```


----------



## hey-ho (9. Jul 2008)

Vielen Dank schon mal für eure schnelle Hilfe. Ich werde mir das mal genauer anschauen und in meine Anwendung einbauen.


----------

