我试图在我的构造函数中调用我创建的keyPressed方法(覆盖)我正在制作的游戏允许对象移动。我在主类中实现了ActionListener和KeyListener。
这甚至可能吗?我尝试按this.keyPressed(KeyEvent e)
调用该方法,但我不知道如何初始化e。
做这样的事情最好的方法是什么?
Timer timer = new Timer(DELAY, this);
public Game(Main game) {
this.game = game;
gamePanel = new GamePanel();
buttonPanel = new JPanel();
buttonPanel.add(startButton);
this.addKeyListener(this);
this.setFocusable(true);
this.setFocusTraversalKeysEnabled(false);
this.getContentPane().add(gamePanel, BorderLayout.CENTER);
this.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
this.setSize(1000, 1000);
this.setVisible(true);
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
game.move("u");
break;
case KeyEvent.VK_DOWN:
game.move("d");
break;
case KeyEvent.VK_RIGHT:
game.move("r");
break;
case KeyEvent.VK_LEFT:
game.move("l");
break;
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if (src == timer) {
game.updateBoard();
if (game.gameEnded()) {
timer.stop();
}
repaint();
} else if (src == startButton) {
if (timer.isRunning()) {
timer.stop();
} else {
timer.stop();
}
}
}
答案 0 :(得分:1)
问题在于:
while(!game.gameEnded()) {
game.updateBoard();
KeyEvent e = null;
this.keyPressed(e);
}
如果使用Swing Event-Dispatching-Thread调用构造函数,它会阻止它,因此不会调度任何事件。
正确的方法应该是使用javax.swing.Timer
,定期触发ActionEvent
。
int period = 1000;//fire ActionEvent every second
Timer timer = new Timer(period,new ActionListener(){
public void actionPerformed(ActionEvent e){
//do your stuff, for example
game.updateBoard();
}
});
timer.start();
您不应该自己调用EventListener中的方法,因为它们都应该由Event-Dispatching-Thread处理。