AWTEventListener wird 3 mal aufgerufen

MScalli

Erfahrenes Mitglied
Hi.

habe ein kleines Problem in meinem Programm.
Ich will dieses mit dem Escape-Knopf jederzeit beenden können.
Deswegen habe ich diese Methode eingebaut

Code:
private void exitOnEscape() {
    AWTEventListener ael = new AWTEventListener() { 
		public void eventDispatched(AWTEvent e) {
			KeyEvent ke = (KeyEvent)e;
			System.out.println(ke.getKeyChar());
			
			if(ke.getKeyChar() == ''){
		    	// anwort --> 0=ja, 1=nein, 2=abbrechen
		    	int antwort = JOptionPane.showConfirmDialog(null, "Wollen Sie das Programm wirklich beenden?");
		    	if(antwort == 0 ){ 
		    		f.dispose();
		    		System.exit(0);
		    	}
			}
		} 
    }; 
    Toolkit.getDefaultToolkit().addAWTEventListener( ael, AWTEvent.KEY_EVENT_MASK );
}
das Zeichen für escape(ein Quadrat) lässt sich nicht in den Code rein kopieren.


(hab halt geschaut was beim drücken von escape für ein Zeichen erstellt wird und frage dieses halt jetzt ab ;). Wird wohl nicht die "richtigste" Methode sein, aber sie geht^^

na egal. auf jeden fall wird das jetzt 3 mal aufgerufen, was beim beenden kein Problem ist(also bei ja.. Programm wird ja dann gleich beendet). Aber wenn ich nein oder abbrechen drücke kommt der Dialog genau 3 mal.

Ich muss es mit dem AWTEventListener machen da ich das Programm jederzeit mit Escape beenden können will.

kann mir da wer weiter helfen
 
Moin!
Es wird 3mal aufgerufen, weil auch 3 Events vorliegen.
Pressing and releasing a key on the keyboard results in the generating the following key events (in order):
KEY_PRESSED
KEY_TYPED (is only generated if a valid Unicode character could be generated.)
KEY_RELEASED

Über getID() kannst du abfragen, welches Event es genau war
Code:
if(keyEvent.getID() == KeyEvent.KEY_PRESSED)

Das Escape Zeichen, wie alle anderen auch, bekommst du über den KeyCode
Code:
if(keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE)


*grüssle*
MeinerEiner


PS: Bevor du das Event in ein KeyEvent castest würd ich aber erstmal abfragen,
ob es denn auch ein KeyEvent ist (mit instanceof)
 
PERFEKT!!
das mit den 3 Methoden hatte ich zwar auch vermutet, bin aber nicht so wirklich darauf gekommen wie ich das abfragen soll.

tipps sind spitze und lösen alle Probs in sekunden ;)

Dank dir MeinerEiner..

hier der Fertige Code(eigentlich bei den tipps nicht mehr nötig^^)

Code:
private void exitOnEscape() {
    AWTEventListener ael = new AWTEventListener() { 
		public void eventDispatched(AWTEvent e) {
			KeyEvent ke = (KeyEvent)e;
			System.out.println(ke.getKeyChar());
			
			if(ke.getID() == KeyEvent.KEY_PRESSED){
				if(ke.getKeyChar() == KeyEvent.VK_ESCAPE){
			    	// anwort --> 0=ja, 1=nein, 2=abbrechen
			    	int antwort = JOptionPane.showConfirmDialog(null, "Wollen Sie DocBook wirklich beenden?");
			    	if(antwort == 0 ){ 
			    		f.dispose();
			    		System.exit(0);
			    	}
				}
			}
		} 
    }; 
    Toolkit.getDefaultToolkit().addAWTEventListener( ael, AWTEvent.KEY_EVENT_MASK );
}
 
Habe das mit dem instanceof mal ausprobiert.
meinst du das so in der richtung

Code:
			KeyEvent ke = null;
			
			if(e instanceof KeyEvent){
				ke = (KeyEvent)e;
			}
 
Nur vielleicht noch ein kleiner Tip..
Wie jetzt bei ID und KeyCode solltest du mehr mit Konstanten arbeiten.
Also statt
Code:
// anwort --> 0=ja, 1=nein, 2=abbrechen
if(antwort == 0 )
besser so:
Code:
if(antwort = JOptionPane.YES_OPTION) // JOptionPane.NO_OPTION JOptionPane.CANCEL_OPTION

Erleichtert einem das Leben wirklich, und mach den Code auch viel lesbarer...

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
danke für die Tipps.
habe es jetzt so umgebaut und werde mich auch daran halten ;)

Code:
private void exitOnEscape() {
    AWTEventListener ael = new AWTEventListener() { 
		public void eventDispatched(AWTEvent e) {
			KeyEvent ke = null;
			
			if(e instanceof KeyEvent){
				ke = (KeyEvent)e;
			
				if(ke.getID() == KeyEvent.KEY_PRESSED){
					if(ke.getKeyChar() == KeyEvent.VK_ESCAPE){
				    	// anwort --> JOptionPane.YES_OPTION=ja, JOptionPane.NO_OPTION=nein, JOptionPane.CANCEL_OPTION=abbrechen
				    	int antwort = JOptionPane.showConfirmDialog(null, "Wollen Sie DocBook wirklich beenden?");
				    	if(antwort == JOptionPane.YES_OPTION ){ 
				    		f.dispose();
				    		System.exit(0);
				    	}
					}
				}
			}
		} 
    }; 
    Toolkit.getDefaultToolkit().addAWTEventListener( ael, AWTEvent.KEY_EVENT_MASK );
}
 
Zurück