【问题标题】:Rectangle is not moving with arrow keys矩形没有用箭头键移动
【发布时间】:2018-04-16 17:46:20
【问题描述】:

我正在尝试制作简单的游戏,但我的第一个问题是当我按下箭头键时我的矩形没有移动。

这是我的代码:

public class Gameseeting extends JPanel implements ActionListener, KeyListener
{
  Timer tt= new Timer(5, this);
  int x=2, y=210, velx=0,vely=0;
  Gameseeting ()
  {
    tt.start();
    setFocusable(true);
    addKeyListener(this);
    setFocusTraversalKeysEnabled(false);
  }
  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    g.drawRect(x, y, 40, 50);
  }

  public void actionPerformed(ActionEvent ae)
  {

    x += velx;
    y += vely;
    repaint();
  }

  public void keyPressed(KeyEvent e)
  {
    int code = e.getKeyCode();

    if (code == KeyEvent.VK_DOWN) {
      vely = 1;
      velx = 0;
    }
    if (code == KeyEvent.VK_UP) {
      vely = -1;
      velx = 0;
    } 
    if (code == KeyEvent.VK_LEFT) {
      vely = 0;
      velx = -1;
    }
    if (code == KeyEvent.VK_RIGHT) {
      vely = 0;
      velx = 1;
    }
  }

  public void keyTyped(KeyEvent ke)
  {
  }

  public void keyReleased(KeyEvent ke) {
    velx=0;
    vely=0;
  }
}

我需要你的帮助,请告诉我我做错了什么。谢谢!

【问题讨论】:

  • 您在 actionPerformed 中调用了函数 repaint();,但我在任何地方都看不到该函数?
  • 附带说明,类名应始终以大写字母开头。请参阅Java Naming Conventions
  • 您使用哪种颜色为矩形(和背景)着色?当您在方法或System.out.println() 语句中添加断点以查看变量的内容时会发生什么?他们会改变吗?他们保持不变吗?方法是否按预期调用?还是不是?

标签: java swing


【解决方案1】:

我已多次阅读您的代码,但没有什么不正确的。所以我创建了一个小启动程序,它创建了一个JFrame,并将您的自定义JPanel 作为内容窗格...

public class MoveRectangleArrowKeys {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MoveRectangleArrowKeys::new);
    }

    MoveRectangleArrowKeys() {
        JFrame frame = new JFrame("Move Rectangle with Arrow Keys");
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new Gameseeting());
        frame.setVisible(true);
    }
}

...它按预期工作。

所以,问题出在其他地方。无论是在面板的创建过程中,还是在它与其他代码的互操作中,或者在它的预期行为中。

首先,创造。 Swing 组件只能在 Swing 的事件调度线程 (EDT) 上创建。如果在您的 main 方法创建应用程序的 UI 时没有使用 SwingUtilities.invokeAndWait(...)SwingUtilities.invokeLater(...),您可能会将 Swing 置于错误状态。

第二,与其他代码的互操作。您调用了setFocusable(true);,这使您的组件具有焦点。但如果框架中有多个可聚焦组件,则焦点可能会被另一个 UI 元素占据。尝试在面板中单击鼠标。如果矩形开始响应箭头键,那么您可能只需要在框架可见后在Gameseeting 面板上调用requestFocusInWindow()

第三,您的期望可能有误。如果您按数字键盘上的向上箭头,您可能希望矩形移动以响应VK_UP 代码,但它不会。该代码需要测试VK_NUMPAD8 代码。

无论如何,发布的代码都有效。如果您简化了代码以将其发布在 StackOverflow 上,则您可能无意中删除了问题代码。如果您还没有简化它,那么问题出在您项目中的其他代码上。如果上述提示对您没有帮助,您需要编辑帖子以添加更多信息(和代码),以便我们重现问题并提出解决方案。

记得发布一个最小的完全可验证示例。您发布的代码不完整;我必须添加上面的启动器代码来创建和测试您的自定义JPanel。由于它没有说明问题,因此它不是可验证的示例。可能是启动代码有问题,您的启动代码失败了,但我的没有。 “最小”意味着删除重现问题不需要的所有不必要的代码。例如,您可以删除 VK_UPVK_LEFTVK_DOWN 代码,只留下 VK_RIGHT 代码。这是一个最小化,它仍然可以使代码“完成”。但是删除JPanel 的构造并没有给你留下一个完整的例子。测试您发布的代码,并确保它仍然可以显示问题;否则我们只能猜测真正的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2013-06-19
    • 2020-10-23
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多