# KeyEvent - Programm mit ESC beenden



## mobile (4. Mrz 2007)

Hi, warum funktioniert das hier nicht?


```
//Ereignis Bahandlung für den End Button
	class TastEvent extends WindowAdapter implements KeyListener {
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
				System.exit(0);
			}
			
		}
		public void keyReleased(KeyEvent e) {
		}
		public void keyTyped(KeyEvent e) {
		}
	}

//Anmeldung des Frames
addWindowListener(new TastEvent());
```

Möchte erreichen, dass wenn ich ESC betätige, dass ich mein Prog. schließt. 

Danke viel Mals!


----------



## L-ectron-X (4. Mrz 2007)

```
class TastEvent extends KeyAdapter { 
   public void keyPressed(KeyEvent e) { 
      if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
         System.exit(0); 
      }
   }
}


//Im Konstruktor des Frames
addKeyListener(new TastEvent());
```


----------



## Guest (9. Mrz 2007)

also bei mir sieht das jetzt so aus: 

```
//Ereignis Bahandlung für den End Button
	class TastEvent extends KeyAdapter {
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
				System.exit(0);
		    } 
			if(e.getKeyCode() == KeyEvent.VK_ENTER) {
				String datum = ta.getText()+'.'+mon.getText()+'.'+jahr.getText();
		    	kon.setText(datum);
		    	
		    	Test te =  new Test(datum);
		    	if(te.testlauf(datum) == true) {
		    		Umwandlung u = new Umwandlung(datum);
		    		Berechnung b = new Berechnung(u.getTag(),u.getMonat(),u.getJahr());
		    		au.setText(te.toString() + ' ' + b.toString()); 
		    	}
		    	else {
		    		kon.setText("Fehler");
		    		au.setText("Bitte kontrolliere Sie ihre Eingabe!");
		    	}
			}
		}
	}
```

Dann ziemlich am Anfang im Konstruktor


```
//Frame bei WindowListener anmelden
		addKeyListener(new TastEvent());
```

Aber egal ob ich Enter oder Escape drücke, es passiert einfach ncihts!

Hoffe ihr wisst weiter!


----------



## Marco13 (10. Mrz 2007)

Vermutlich hast du eine TextArea oder so, wo nach dem Prgrammstart der Cursort drin ist? Dann kommen die Events erstmal NUR in der TextArea/TextField etc. an, und nicht in dem Frame.


----------



## Hilefoks (10. Mrz 2007)

In meiner App reagiere ich so auf Strg+M  (im Konstruktor meines JFrame).... 

```
((JPanel) this.getContentPane()).getInputMap(
				JComponent.WHEN_IN_FOCUSED_WINDOW).put(
				KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK),
				"menuebar");
		((JPanel) this.getContentPane()).getActionMap().put("menuebar",
				new AbstractAction() {
					public void actionPerformed(ActionEvent arg0) {
						mbar.toggleVisibility();
					}
				});
```
allerdings glaube ich das es noch einen besseren Weg geben müsste. Wer kennt einen?

Der Weg über einen einfachen addKeyListener() auf das Fenster kann nicht funktionieren, weil ständig andere Komponenten den Fokus besitzen (JLabel, JButton, JTextArea, ....)  - eine Tatsache die mir auch einige Stunden gekostet hat. ;-)


MfG,
Hilefoks


----------



## mobile (10. Mrz 2007)

Und wie könnte man das dann lösen? Also zumindest das mit man über Enter direkt was einleiten kann, das müsste schon sein!  Gibt es nicht eine Möglichkeit, wenn man auf eine leere Stelle des Fenster klickt, dass das komplette Window dann den Focus hat und auf Escape oder Return reagiert?

Also ich befinde mich immer in einem JTextField wenn die Eingabe von Enter oder Escape erfolgt. Könnte man die Events dafür  nicht in eine Methode schreiben und diese Methode, dann von jedem JTextField aufrufen, wenn dort ein Escape oder Retur auftritt?


----------



## Wildcard (11. Mrz 2007)

Registrier dich in der InputMap des Frames verknüpf diese mit der ActionMap des Frames in der du deine Action ablegst.


----------



## Guest (11. Mrz 2007)

ok, hab da grad nichts von verstanden


----------

