【发布时间】:2014-07-08 01:36:35
【问题描述】:
我正在用 java 编写一个简单的蛇应用程序我有一个包含游戏的 gamePanel 并将其添加到 JFrame Window 类中,当我第一次启动游戏时,keylistener 工作正常但是当游戏丢失时(按下按钮时,游戏会自行重置,但按键侦听器变得无响应),我看不出它应该变得无响应的任何原因,我没有对它做任何事情
class Window extends JFrame {
private static final long serialVersionUID = -2542001418764869760L;
private final ButtonPanel buttonPanel;
private GamePanel gamePanel;
private ThreadsController c;
// now size of the game can change only by modifiying this width and height
public JFrame getFrame() {
return this;
}
public JPanel getGamePanel() {
return gamePanel;
}
public JPanel getButtonPanel() {
return buttonPanel;
}
public Window() throws FileNotFoundException {
this.setTitle("Snake");
this.setSize(300, 300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
gamePanel = new GamePanel();
this.buttonPanel = new ButtonPanel(this, c);
this.add(new TopPanel(), BorderLayout.NORTH);
this.add(gamePanel, BorderLayout.CENTER);
this.add(buttonPanel, BorderLayout.SOUTH);
this.setVisible(true);
c = new ThreadsController(gamePanel.getSnakeDepartPosition());
this.buttonPanel.getExit().addActionListener(
new ButtonActionListener(this, c));
this.buttonPanel.getNewGame().addActionListener(
new ButtonActionListener(this, c));
c.start();
this.addKeyListener(new KeyboardListener());
this.setFocusable(true);
}
private class KeyboardListener extends KeyAdapter {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
// if it's not the opposite direction
if (ThreadsController.directionSnake != Directions.LEFT)
ThreadsController.directionSnake = Directions.RIGHT;
break;
case KeyEvent.VK_UP:
if (ThreadsController.directionSnake != Directions.BOTTOM)
ThreadsController.directionSnake = Directions.TOP;
break;
case KeyEvent.VK_LEFT:
if (ThreadsController.directionSnake != Directions.RIGHT)
ThreadsController.directionSnake = Directions.LEFT;
break;
case KeyEvent.VK_DOWN:
if (ThreadsController.directionSnake != Directions.TOP)
ThreadsController.directionSnake = Directions.BOTTOM;
break;
default:
break;
}
}
}
}
here is the action listener
public class ButtonActionListener implements ActionListener {
private Window frame;
private ThreadsController t;
public ButtonActionListener(Window frame, ThreadsController t) {
this.frame = frame;
this.t = t;
}
@Override
public void actionPerformed(ActionEvent clickedButton) {
// TODO Auto-generated method stub
/*
* t.setAlive(false);
*
* frame.getContentPane().remove(frame.getGamePanel());
*
*
*
* frame.add(gamePanel, BorderLayout.CENTER); frame.setVisible(true);
*/GamePanel gamePanel = new GamePanel();
gamePanel.addKeyListener(new KeyboardListenner());
frame.add(gamePanel, BorderLayout.CENTER);
frame.setVisible(true);
t = new ThreadsController(new Tuple(10, 10));
t.start();
}
}
【问题讨论】:
标签: java swing user-interface keylistener