Java在Constructor中实现ActionListener方法

时间:2017-12-07 00:44:36

标签: java swing actionlistener keylistener

我试图在我的构造函数中调用我创建的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();
        }
    }
}

1 个答案:

答案 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处理。

相关问题