【问题标题】:Move JButton every click (KeyEvent)每次点击移动 JButton (KeyEvent)
【发布时间】:2021-06-21 23:02:26
【问题描述】:

我试图创建一个简单的游戏。为此,我创建了一个向下和向上移动的 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, 60, 40);
        } else if (key == KeyEvent.VK_UP) {
            y -= 4;
            jb.setBounds(40, y, 60, 40);
        }
    }
});

【问题讨论】:

    标签: java swing jbutton keyevent


    【解决方案1】:

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

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

    这是使它工作的必要条件

    【讨论】:

      【解决方案2】:

      正如 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, y, 60, 40);
          } 
      }
      

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

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

      【讨论】:

      • getY()jb.getY() 当我们简化它时,我会使用jb.setLocation(jb.getX(), y);
      • @Holger 实际上应该是jb.setLocation(jb.getX() + delta, y),否则你只是放回原来的位置......但对我来说,我可能不会为此目的使用组件,但那是我
      • 咳咳,x 应该是原始值。 y 已更改。 “使用组件”是什么意思?
      • 我建议将jb.setBounds(40, y, 60, 40); 替换为jb.setLocation(jb.getX(), y);,假设您的答案代码未更改,因此y 确实包含更新后的值。 x 不应该改变,在原始代码中它总是40,但最好使用jb.getX() 而不是硬编码的值。是的,自定义绘画程序会好得多,我只是无法将这个概念与“使用组件”这一短语相匹配。
      • 好吧,我只是使用问题和答案的现有代码作为起点,其中 x 始终为40。那肯定永远不会支持 x 运动。相比之下,使用jb.getX() 确实 支持它,因为它不会取消在不同代码位置所做的更改。无论如何,我理解自定义绘画程序的意义,我也更喜欢它。我只是在阅读您的第一条评论时才明白。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2018-08-27
      • 2013-10-28
      • 1970-01-01
      • 2013-12-09
      相关资源
      最近更新 更多