Java 令人不快的小方形移动(用键移动JPanel中的JComponent)
好的,我正在尝试重新发明轮子,并且只使用Swing和AWT以及Java默认附带的东西编写一个蛇游戏。但是,在那之前,我正在学习如何移动窗户上的正方形。切掉咪咪,事情是这样的: 我有一个名为HeadSquare的定制JComponent类:Java 令人不快的小方形移动(用键移动JPanel中的JComponent),java,swing,awt,arrow-keys,Java,Swing,Awt,Arrow Keys,好的,我正在尝试重新发明轮子,并且只使用Swing和AWT以及Java默认附带的东西编写一个蛇游戏。但是,在那之前,我正在学习如何移动窗户上的正方形。切掉咪咪,事情是这样的: 我有一个名为HeadSquare的定制JComponent类: public class HeadSquare extends JComponent { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int screenWidth
public class HeadSquare extends JComponent {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth = (int) screenSize.getWidth();
int screenHeight = (int) screenSize.getHeight();
int defaultSize = screenWidth / 2;
int snakeSquareDefaultSize = 10;
int headSquareXPos = ((defaultSize / 2) - (snakeSquareDefaultSize / 2));
int headSquareYPos = ((defaultSize / 2) - (snakeSquareDefaultSize / 2));
Rectangle head = new Rectangle(headSquareXPos, headSquareYPos, snakeSquareDefaultSize, snakeSquareDefaultSize);
Color snakeColor = Color.green;
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(0, 0);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(defaultSize, defaultSize);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D graphics2D = (Graphics2D) g;
g.setColor(snakeColor);
super.paintComponent(g);
graphics2D.fill(head);
}
}
我有一个杰出的JPanel,在其他地方被宣布:
snakePanel = new JPanel();
Main bla bla bla:
headSquare = new HeadSquare();
snakePanel.requestFocus();
snakePanel.add(headSquare);
下面是:
snakePanel.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
headSquare.headSquareXPos -= 10;
headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
snakePanel.repaint();
} else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
headSquare.headSquareXPos += 10;
headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
snakePanel.repaint();
} else if (arg0.getKeyCode() == KeyEvent.VK_UP) {
headSquare.headSquareYPos -= 10;
headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
snakePanel.repaint();
} else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
headSquare.headSquareYPos += 10;
headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
snakePanel.repaint();
}
}
});
contentPane.add(snakePanel, BorderLayout.CENTER);
对于熟练的人来说,这个问题可能会变得很明显,除了我之外,其他人都知道:当你按下一个箭头时,血腥的方块就会停止,然后再按下另一个箭头。向上……向左。如果同时按这两个键,它将运行正常,但如果按LEFT-=10,然后向上,它将停止LEFT的-=10,它将等待一段时间,然后开始向上,忽略原来的LEFT
嗯,我希望这个话题不要太冗长,我已经清楚地表达了我自己。我希望它能结合箭头的移动,而不会在快板中出现不方便的停顿,在C中,这是默认情况下发生的。你知道为什么会发生这种情况吗?你知道如何改进这个动作吗
我非常感谢你 请参阅这篇文章,其中解释了使用密钥侦听器的问题。首选的解决方案是使用键绑定。1要更快获得更好的帮助,请发布一个。2对于Swing,通常在基于AWT的较低级别的KeyListener上使用键绑定。有关如何使用它们的详细信息,请参见。SnakePane似乎正在使用布局管理器,更改标题窗格的位置只是暂时的,一旦SnakePane被验证,它将被放置在布局管理器想要的任何位置