矩形不随箭头键移动

我想做一个简单的游戏,但我的第一个问题是,当我按下箭头键时,我的矩形没有移动。

这是我的代码:

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

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

我已经多次阅读过您的代码,没有任何内容因为不正确而跳出来。 所以我创建了一个小启动程序,用你的自定义JPanel创建一个JFrame作为内容窗格……

 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组件。 如果您在main方法创建应用程序的UI时未使用SwingUtilities.invokeAndWait(...)SwingUtilities.invokeLater(...) ,则可能会将Swing置于错误状态。

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

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

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

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