矩形不随箭头键移动

时间:2018-04-16 17:46:21

标签: java swing

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

这是我的代码:

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;
  }
}

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

1 个答案:

答案 0 :(得分:0)

我已经多次阅读过您的代码了,没有任何内容因为不正确而跳出来。因此,我创建了一个小型启动程序,使用您的自定义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的Event Dispatching Thread(EDT)上创建Swing组件。如果在SwingUtilities.invokeAndWait(...)方法创建应用程序的UI时未使用SwingUtilities.invokeLater(...)main,则可能会将Swing置于错误状态。

其次,与其他代码互操作。您调用了setFocusable(true);,这使您的组件可以集中精力。但是如果帧中有多个可聚焦组件,则焦点可以由另一个UI元素进行。在面板中尝试鼠标单击。如果矩形开始响应箭头键,那么您可能只需在框架可见后在Gameseeting面板上调用requestFocusInWindow()

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

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

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