PDA

View Full Version : [JAVA] KeyListener reagiert nicht mehr



Death Overlord
05.01.2011, 10:26
Hi, ich habe gerade eine kleine Application in Java geschrieben. Diese besteht aus einem JFrame mit einem KeyListener, MouseListener, MouseMotionListener und JButtons. Zu Beginn sind die JButtons noch nicht zum JFrame hinzugefügt, erst wenn man das Menü aufruft werden sie hinzugefügt. Wenn man jetzt einen der JButtons betätigt wird danach nicht mehr auf Tastendrücke reagiert (dies passiert auch wenn dem JButton kein ActionListener übergeben wurde). Der MousListener regiert immer noch. Hat jemand ne Idee an was das liegen kann?

Schwops
06.01.2011, 21:01
Hi, ich habe gerade eine kleine Application in Java geschrieben. Diese besteht aus einem JFrame mit einem KeyListener, MouseListener, MouseMotionListener und JButtons. Zu Beginn sind die JButtons noch nicht zum JFrame hinzugefügt, erst wenn man das Menü aufruft werden sie hinzugefügt. Wenn man jetzt einen der JButtons betätigt wird danach nicht mehr auf Tastendrücke reagiert (dies passiert auch wenn dem JButton kein ActionListener übergeben wurde). Der MousListener regiert immer noch. Hat jemand ne Idee an was das liegen kann?

Poste mal bitte den Code. Welches Menü? Sind die Buttons auf einem eigenem Panel? etc ...

Death Overlord
09.01.2011, 14:47
Der Teil vom Code der für das Problem wichtig ist:


public class Main extends JFrame implements Runnable, KeyListener, MouseListener, MouseMotionListener {

BufferStrategy strategy;

byte skipTicks = 1000 / 25;
long nextGameTick = System.currentTimeMillis();
int sleepTime;

/** 0 = Menü 1 = Spiel 2 = Mapeditor */
public static byte whatIsRunning = 1;

/** Tasten (true=gedrückt) */
public static boolean W, A, S, D, T0, ALT;
/** Kordinaten der Maus */
public static double mousex, mousey;
/** Zustand der Maus */
public static boolean mousePressed;

Game game = new Game();
Menu menu = new Menu(this);

public static void main(String[] args) {
new Main().run();
}

public Main() {
super(Language.WINDOW_TITEL[Language.language]);
try {
setIconImage(ImageIO.read(Main.class.getResource("images/icon.png")));
} catch (IOException e) { e.printStackTrace(); }
setDefaultCloseOperation(EXIT_ON_CLOSE);
setUndecorated(true);
setResizable(false);
setIgnoreRepaint(true);
addKeyListener(this);
addMouseListener(this);
addMouseMotionListener(this);
setVisible(true);
createBufferStrategy(2);
strategy = getBufferStrategy();
}

/**
* GameLoop
*/
@Override
public void run() {
while (true) {
switch (whatIsRunning) {
case 1: // Spiel
Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, tk.width, tk.height);

game.loop(g);

g.setColor(Color.RED);
g.drawString("WhatIsRunning: " + whatIsRunning + " ShowMiniMenu: " + game.showMiniMenu + " x: " + mousex + " y: " + mousey+ W+A+S+D+T0+ALT, 5, 15);

g.dispose();
strategy.show();
break;
case 2: // Mapeditor
break;
case 0: // Menü
if (menu.first) {
Graphics2D g1 = (Graphics2D) strategy.getDrawGraphics();
g1.setColor(Color.WHITE);
g1.fillRect(0, 0, tk.width, tk.height);
g1.setColor(Color.BLACK);

menu.drawBackground(g1);

g1.dispose();
strategy.show();

menu.start();
}
break;
}

nextGameTick += skipTicks;
sleepTime = (int) (nextGameTick - System.currentTimeMillis());
if (sleepTime > 0) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

...
}




public class Menu implements ActionListener {

Image mainMenuBackground;

JButton ne = new JButton("GUg");

public boolean first = true;

Main main;

public Menu(Main main) {
this.main = main;
try {
mainMenuBackground = new Image(ImageIO.read(Game.class.getResource("images/mainMenuBackground.png")));
} catch (IOException e) {e.printStackTrace();}
}

public void start() {
main.add(ne);
ne.addActionListener(this);
ne.setBounds(100, 100, 100, 20);

first = false;
}

public void end() {
main.remove(ne);
ne.removeActionListener(this);
first = true;
}

public void actionPerformed(ActionEvent e) {
System.out.println("> ActionLister wurde aufgerufen");
if (e.getSource() == ne) {
System.out.println("> der Button 'ne' wurde gedrückt");
end();
Main.whatIsRunning = 1;
}
}

public void drawBackground(Graphics2D g) {
g.drawImage(mainMenuBackground.image, (int) Main.tk.getWidth() / 2 - mainMenuBackground.image.getWidth() / 2,
(int) Main.tk.getHeight() / 2 - mainMenuBackground.image.getHeight() / 2, null);
g.setColor(Color.GREEN);
String news[] = news();
for (int i = 0; i < news.length; i++) {
g.drawString(news[i], (int) Main.tk.getWidth() / 2, (int) Main.tk.getHeight() - 200 + i * 20);
}
}

...
}

Schwops
09.01.2011, 15:20
Ich habs jetzt nur grob angeschaut, aber so wie ich das sehe, liegt das Problem daran, dass der ActionListener des Buttons in der Klasse Menu liegt. Der Button an sich, wird jedoch an den JFrame in der Main Klasse gehängt.
Somit kann das Klicken auf den Button nur in dieser Main Klasse abgefangen werden.

Dein Problem liegt im Grunde an deiner gruseligen Architektur. Aber um jetzt nicht alles neu schreiben zu müssen sollte es reichen, wenn du im Menu ein PropertyChangedEvent losfeuerst und das entsprechend in Main abfängst und darauf reagierst.