Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke

Miriam90

Mitglied
Hallo,

ich programmiere gerade ein Snake und es läuft auch soweit ganz gut. Als letztes habe ich hinzugefügt, dass man das Spiel über einen Tastendruck pausieren kann. Zunächst wollte ich dafür das Leerzeichen nehmen. Dieses wählte allerdings meinen Button "Spiel starten" aus, da dort automatisch der Focus drauf war. Ich habe als vorübergehende Lösung das P als Taste für die Pause genommen, habe dann aber trotzdem mal herumprobiert, wie ich den Focus wegbekomme.

Über
Java:
buttonStart.setFocusable(false);
scheint das zu funktionieren. Ich habe die Methode für alle meine 3 Buttons angewendet. Und jetzt das Problem: Dadurch reagiert der ActionListener plötzlich nicht mehr auf Tastendrücke!

Ist es etwa eine Voraussetzung für den ActionListener, dass es einen Focus gibt? Oder gibt es eine andere Ursache?

Wenn sich das so nicht beantworten lässt, dann kann ich auch noch Code posten, aber vielleicht ist ja schon jemandem auf den ersten Blick ein Zusammenhang bekannt.

Ich bin für jeden Hinweis dankbar!

Miriam
 
Über
Java:
buttonStart.setFocusable(false);
scheint das zu funktionieren. Ich habe die Methode für alle meine 3 Buttons angewendet. Und jetzt das Problem: Dadurch reagiert der ActionListener plötzlich nicht mehr auf Tastendrücke!

Hallo Miriam,

herzlich willkommen bei "java-forum.org"!

Die Mnemonics müssten eigentlich weiterhin funktionieren. Beispiel:
Java:
btPause.setMnemonic(KeyEvent.VK_P);

Gruß,
André
 
Das Problem scheint mir, dass jetzt die Buttons an sich nicht mehr fokusierbar sind.

How to Use the Focus Subsystem (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
steht in der ersten Zeile:
Many components — even those primarily operated with the mouse, such as buttons — can be operated with the keyboard. For a key press to affect a component, the component must have the keyboard focus.


Probier mal die Buttons entsprechend dem Kontext auf nicht fokusierbar zu setzten, dann sollte mit der Leertaste immer der entsprechende Button angesprochen werden
 
Hallo André, Hallo hellmy,

Danke für die schnellen Antworten und frohe Weihnachten! 😉

@Andre
Was sind Mnemonics? Mein Code für die Tastendrücke sieht aus wie folgt (und hatte ja auch funktioniert, bevor ich allen Buttons den Fokus weggenommen habe):
Java:
	public class MyKeyAdapter extends KeyAdapter{
		@Override
	    public void keyPressed(KeyEvent e) { //Tastendrücke
			if (game!=null){
			    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			    	keystrokes.add("right");		    	
			    }
			    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			    	keystrokes.add("down");
			    }		    
			    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			    	keystrokes.add("left");	
			    }
			    if (e.getKeyCode() == KeyEvent.VK_UP) {
			    	keystrokes.add("up");
			    }		    
			    if (e.getKeyCode() == KeyEvent.VK_SPACE) {	   		    				    	
			    	if (game.paused==false){		    		
		    		   synchronized (game) {
		    			   game.pause();
		    		   }
			    	}
			    	else{
			    		synchronized (game) {
			    			game.proceed();
						}
			    	}	
			    }
			}
		}
	}

Beim initialisieren meines Frames, gebe ich dann allen Componenten den Adapter mit:
Java:
buttonStart.addKeyListener(new MyKeyAdapter());

Wo würde ich dort jetzt ein Mnemonic verwenden?

@hellmy
Ich bin nicht sicher, ob meine Frage klar geworden ist. Ich möchte ja gerade nicht, dass die Buttons durch Leerzeichen angesprochen werden. Wird in diesem Tutorial nicht nur gezeigt, wie man den Focus auf die gewünschte Komponente bringt? Oder übersehe ich die Stelle, an der erläutert wird, wie man den Focus wegnimmt (ohne dabei seine anderen Tastendrücke zu zerschießen)?
 
Der "Mnemonic" eines Buttons ist die Taste, die, wenn sie mit dem Look and Feel "mouseless modifier" (in der Regel Alt) kombiniert wird, den Button aktiviert, falls der Fokus irgendwo innerhalb des Fensters ist, das diesen Button beherbergt.

Tastatur Ereignisse werden durch die Komponente mit dem Tastaturfokus ausgelöst, wenn der Benutzer Tasten auf der Tastatur drückt oder sie loslässt. Wenn durch setFocusable(false) kein Tastaturfokus mehr möglich ist, kann auch kein Tastatur Ereignis mehr ausgelöst werden.

In Deinem Code wird übrigens kein "ActionListener" benutzt, den Du oben beschreibst.

Gruß,
André

PS: mit [c]btPause.setMnemonic(KeyEvent.VK_P);[/c] würde z.B. der ActionListener des Buttons "btPause" aktiviert werden, wenn Du Alt+P drückst.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben