KeyListener und ActionListener Problem

Dasha

Mitglied
Hi,

ich habe momentan ein sehr misteriöses Problem.
Ich hab einen Key- und einen ButtonListener, welche beide eigentlich korrekt arbeiten.
Ich kann mein Spiel über die Taste S oder über den Button "starten" aufrufen, das Spiel ist dann noch pausiert.
Mit P kann ich das Spiel dann fortsetzen/beginnen.
Mit dem KeyListener funktioniert es ohne Probleme aber in Kombination mit den Button Listener tauchen dann einige Probleme auf.

Die Kombination S und P funktioniert ohne Probleme aber wenn ich den "starten" Button klicke und dann P funktioniert es nicht.
Sobald ich den Button drücke reagiert mein KeyListener nicht mehr auf irgendwelche Eingaben.

Java:
Ausschnitt aus Code:
//Aus dem SpielPanel

startButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) 
	                {game.start(); System.out.println("Spiel aufgerufen"); }});

...
this.addKeyListener(keyboardListener);
this.setFocusable(true);
..


//Zum starten und pausieren (innere Klasse)
class KeyboardListener implements KeyListener
{
       if(!game.isTerminated())
       {
	     if(event.getKeyCode() == KeyEvent.VK_P)
	     {
		   if(!game.isRunning())	
		    {
				game.setRunning(true);
		    }
		   else	
	           {
				game.setRunning(false);
		    }
		}
          }

if(game.isTerminated())
{
	if(event.getKeyCode() == KeyEvent.VK_S)
	{
		game.start();
	}
}
}
}

Ich hab nicht wirklich keine Idee wo da der Fehler ist.
Meine Vermutung wäre ja, dass es was mit this.setFocusable(true); zutun hat.
Beim Klick wird der Fokus irgendwie verändert wird oder so, aber KA.

mfg
 
Mach mal im KeyboardListener eine Ausgabe, welcher Key gedrückt wurde. Dann siehst Du auf jeden Fall schonmal, ob dort etwas angekommmen ist.
 
In deiner Klasse
Code:
KeyboardListener
fehlen sämtliche Methiden, insb. diejenigen, welche KeyListener implementieren (KeyTyped, KeyPressed...). Wundert mich, dass das überhauot kompiliert.
 
Die Methoden sind drinne, sonst würde ich das Programm ja gar nicht starten können. Den ganzen GUI-Code und die Abfragen für die X-Anderen Tasten hab ich mal weggelassen damit es übersichtlicher wird.

Der KeyListener funktioniert im Grunde ja, wenn ich eine Taste drücke wird auch der Code ausgeführt. Ich hab es schon mit System.ou. getestet.
Aber sobald ich einen Button drücke, egal ob er jetzt das Spiel aufruft, das Spiel pausiert oder nur Text auf der Konsole ausgibt reagiert der keyListener nicht mehr.

Java:
JButton startButton = new JButton("Spiel starten");
		JTextField spielerName = new JTextField("Spieler");
		JButton pauseButton = new JButton("Spiel fortsetzen");
		
		JButton upButton = new JButton();
		JButton leftButton = new JButton();
		JButton fireButton = new JButton();
		JButton rightButton = new JButton();
		JButton downButton = new JButton();
		
		JLabel lebensAnzeige = new JLabel("3 Leben übrig");
		JSlider speedAnzeige = new JSlider();
		
		startButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) 
	                { System.out.println("www");}});


		this.setLayout(new GridLayout(3,1));
		
		JPanel benutzerPanel = new JPanel();
			benutzerPanel.setLayout(new GridLayout(5,1));
			benutzerPanel.setBorder(BorderFactory.createEmptyBorder(15,15, 10, 15));
				benutzerPanel.add(startButton);
				benutzerPanel.add(new JLabel());
				benutzerPanel.add(pauseButton);
				benutzerPanel.add(new JLabel());
				JPanel namensEingabePanel = new JPanel();
				namensEingabePanel.setLayout(new GridLayout(1,2));
					namensEingabePanel.add(new JLabel("Spielername:"));
					namensEingabePanel.add(spielerName);
				benutzerPanel.add(namensEingabePanel);
				
		
		
		JPanel steuerungsPanel = new JPanel();
			steuerungsPanel.setLayout(new GridLayout(3,3));
			steuerungsPanel.setBorder(BorderFactory.createEmptyBorder(20,30, 20, 30));
				steuerungsPanel.add(new JLabel());
				steuerungsPanel.add(upButton);
				steuerungsPanel.add(new JLabel());
				steuerungsPanel.add(leftButton);
				steuerungsPanel.add(fireButton);
				steuerungsPanel.add(rightButton);
				steuerungsPanel.add(new JLabel());
				steuerungsPanel.add(downButton);
				steuerungsPanel.add(new JLabel());
				
		JPanel spielerDatenPanel = new JPanel();
			spielerDatenPanel.setLayout(new GridLayout(3,1));
			spielerDatenPanel.setBorder(BorderFactory.createEmptyBorder(20,30, 20, 30));
				spielerDatenPanel.add(lebensAnzeige);
				spielerDatenPanel.add(speedAnzeige);

	
		this.add(benutzerPanel);
		this.add(steuerungsPanel);
		this.add(spielerDatenPanel);
		this.addKeyListener(keyboardListener);
		
		this.setFocusable(true);
		this.setVisible(true);
 
Könnte daran liegen, dass du duchr den Klick auf den Button ja den Fokus klaust... solltest du mit
Code:
Component#requestFocus
beheben können (wobei bei dir der Frame die Komponente sein sollte).
 
Ah, super Danke 🙂
Also der Button nimmt sich jetzt nicht mehr den Focus sondern fragt quasi nach ob er ihn kurzzeitig von Frame haben/benutzen kann?
 

Neue Themen


Zurück
Oben