我正在尝试制作简单的游戏,但我的第一个问题是当我按箭头键时我的矩形没有移动。
这是我的代码:
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;
}
}
我需要你的帮助,请告诉我我做错了什么。谢谢!
答案 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_UP
,VK_LEFT
和VK_DOWN
代码,只留下VK_RIGHT
代码。这是一个最小化,仍然可以使代码“完成”。但是删除JPanel
的构造并没有给你一个完整的例子。测试您发布的代码,并确保它仍然显示问题;否则我们只能猜测真正的问题。