每次点击移动 JButton (KeyEvent)

问题描述

我试图创建一个简单的游戏。为此,我创建了一个向下和向上移动的 JButton,但是当我单击向下和向上箭头时它只能工作一次。每次单击这些箭头时,我都可以让它移动吗?我已经尝试过 while 循环,但是没有用。

代码如下:

jb = new JButton();
jb.setBounds(40,40,60,40);
jb.setBackground(Color.BLUE);
jb.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {
        // Todo Auto-generated method stub
    }

    @Override
    public void keyreleased(KeyEvent e) {
        // Todo Auto-generated method stub
    }

    @Override
    public void keypressed(KeyEvent e) {
        int key = e.getKeyCode();
        int y = 40;
        if (key == KeyEvent.VK_DOWN) {
            y += 4;
            jb.setBounds(40,y,40);
        } else if (key == KeyEvent.VK_UP) {
            y -= 4;
            jb.setBounds(40,40);
        }
    }
});

解决方法

您必须通过将旧位置的范围更改为类而不是您使用的方法来保留旧位置的引用:

        int y = 40;
        @Override
        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();

这是使其工作所必需的

,

正如 Marcos 已经说过的,在更新按钮之前,您需要知道按钮当前的“位置”。

但是,我建议使用按钮的“实际”位置而不是某些变量,例如可能不代表真实状态...

@Override
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    int y = jb.getY();
    
    if (key == KeyEvent.VK_DOWN) {
        y += 4;
        jb.setBounds(40,y,60,40);
    } 
    else if (key == KeyEvent.VK_UP) {
        y -= 4;
        jb.setBounds(40,40);
    } 
}

话虽如此,我会避免使用 KeyListener,并且根据个人喜好,尝试将工作流程解耦。

相反,我会使用 Key Bindings API,并尝试使移动工作流程更加解耦(较少受物理控制的限制),但是,这就是我。