Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons???

koni1996

Mitglied
Hallo zusammen,

ich habe eine Klasse Window, die von JFrame erbt, eine Klasse Ebene1, die von JPanel erbt, und eine Klasse Ebene2, die ebenfalls von JPanel erbt.

Ein Objekt der Ebene1 wird einem Window-Objekt hinzugefügt, durch einen Klick auf einen JButton in Ebene1 soll die Ebene aus dem Window entfernt werden und durch ein Objekt der Ebene2 ersetzt werden.

Folgender Code für Ebene1 funktioniert fehlerfrei:

Java:
package game;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Ebene1 extends JPanel implements ActionListener
{
	private Window window;
	private BufferedImage backgroundImage;
	private JButton optionsButton;
	private Ebene2 e2;
	
	public Ebene1(Window f)
	{
		window = f;
		
		setSize(window.getContentPane().getSize());
		setLocation(0, 0);
		setLayout(null);
		
		try 
		{
			backgroundImage = ImageIO.read(new File("res/backgroundImage.png"));
		} 
		catch(IOException e) 
		{
			e.printStackTrace();
		}
		
		optionsButton = new JButton();
		
		//optionsButton.setText(languageBundle.getString("options"));
		optionsButton.setFont(window.getButtonFont());
		optionsButton.setForeground(window.getButtonColor());
		optionsButton.setHorizontalTextPosition(JButton.CENTER);
		//optionsButton.setIcon(buttonIcon);
		optionsButton.setSize(200, 50);
		optionsButton.setLocation(((window.getContentPane().getWidth() - 200) / 2), (((window.getContentPane().getHeight() - 200) / 2) + 50));
		optionsButton.addActionListener(this);
		
		add(optionsButton);
	}
	
	private int getXBackgroundImage()
	{
		int xBackgroundImage = 0;
		
		xBackgroundImage = window.getContentPane().getWidth() - backgroundImage.getWidth();
		
		return xBackgroundImage;
	}
	
	private int getYBackgroundImage()
	{
		int yBackgroundImage = 0;
		
		yBackgroundImage = window.getContentPane().getHeight() - backgroundImage.getHeight();
		
		return yBackgroundImage;
	}
	
	@Override
	public void paintComponent(Graphics g) 
	{
		super.paintComponent(g);
		
		g.drawImage(backgroundImage, getXBackgroundImage(), getYBackgroundImage(), this);
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		window.remove(this);
		
		e2 = new Ebene2(window);
		
		window.add(e2);
		window.repaint();
	}	
}

Füge ich jedoch einen zweiten JButton hinzu (der vorerst die selbe Funktion hat), wechselt zwar das JPanel, jedoch reagiert das Programm nicht mehr auf Tastatureingaben wie z. B. "Alt"+"F4". Problemcode:

Java:
package game;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Ebene1 extends JPanel implements ActionListener
{
	private Window window;
	private BufferedImage backgroundImage;
	private JButton playButton;
	private JButton optionsButton;
	private Ebene2 e2;
	
	public Ebene1(Window f)
	{
		window = f;
		
		setSize(window.getContentPane().getSize());
		setLocation(0, 0);
		setLayout(null);
		
		try 
		{
			backgroundImage = ImageIO.read(new File("res/backgroundImage.png"));
		} 
		catch(IOException e) 
		{
			e.printStackTrace();
		}
		
		playButton = new JButton();
		optionsButton = new JButton();
		
		//playButton.setText(languageBundle.getString("play"));
		playButton.setFont(window.getButtonFont());
		playButton.setForeground(window.getButtonColor());
		playButton.setHorizontalTextPosition(JButton.CENTER);
		//playButton.setIcon(buttonIcon);		
		playButton.setSize(200, 50);
		playButton.setLocation(((window.getContentPane().getWidth() - 200) / 2), ((window.getContentPane().getHeight() - 200) / 2));
		playButton.addActionListener(this);
		
		//optionsButton.setText(languageBundle.getString("options"));
		optionsButton.setFont(window.getButtonFont());
		optionsButton.setForeground(window.getButtonColor());
		optionsButton.setHorizontalTextPosition(JButton.CENTER);
		//optionsButton.setIcon(buttonIcon);
		optionsButton.setSize(200, 50);
		optionsButton.setLocation(((window.getContentPane().getWidth() - 200) / 2), (((window.getContentPane().getHeight() - 200) / 2) + 50));
		optionsButton.addActionListener(this);
		
		add(playButton);
		add(optionsButton);
	}
	
	private int getXBackgroundImage()
	{
		int xBackgroundImage = 0;
		
		xBackgroundImage = window.getContentPane().getWidth() - backgroundImage.getWidth();
		
		return xBackgroundImage;
	}
	
	private int getYBackgroundImage()
	{
		int yBackgroundImage = 0;
		
		yBackgroundImage = window.getContentPane().getHeight() - backgroundImage.getHeight();
		
		return yBackgroundImage;
	}
	
	@Override
	public void paintComponent(Graphics g) 
	{
		super.paintComponent(g);
		
		g.drawImage(backgroundImage, getXBackgroundImage(), getYBackgroundImage(), this);
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		window.remove(this);
		
		e2 = new Ebene2(window);
		
		window.add(e2);
		window.repaint();
	}	
}

Ich kann mir das nicht erklären und suche dringend eine Lösung, denn ich werde später natürlich mehrere JButtons brauchen und werde noch mehr mit Tastatureingaben arbeiten!

Vielen Dank für eure Hilfe!
 
Hallo Koni1996,
hatte gerade ein ähnliches Problem wie du. Mein JFrame implementiert einen KeyListener. Ein JPanel welches Buttons enthält implementiert einen ActionListener und beinhaltet eine Reihe von Buttons und wandelt die Button-klicks in KeyEvents um, die dann an den JFrame weitergleitet werden.
Beim Start des Programms funktionierten die Tastatureingaben. Nach einem Button-Klick leider nicht mehr.

Da ich ebenfalls Java-Neuling bin kann ich nichts genaues über die Hintergründe sagen, aber anscheinend werden durch den Button-Klick alle Eingaben an den nun ausgewählten Button weitergeleitet. Da dieser keinen KeyListener implementiert, werden sie übergangen.
Ich konnte dieses Problem lösen, in dem ich jedem Button den JFrame als KeyListener zuweise.

Ich hoffe die Info hilft dir weiter. Bei mir funktioniert nun alles wieder.
 
Wow immer langsam mit den jungen Pferden. Hier liegt (bei euch beiden) ein Fokusproblem vor. Erkundigt euch doch mal bei Google wie man sowas löst.
 
Stimmt. Es reicht bereits, wenn man für die Buttons ".setFocusable(false);" setzt. Danke für den Tipp und wieder etwas neues zum einarbeiten gefunden.
 
Zuletzt bearbeitet:

Zurück
Oben