Java 令人不快的小方形移动(用键移动JPanel中的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

好的,我正在尝试重新发明轮子,并且只使用Swing和AWT以及Java默认附带的东西编写一个蛇游戏。但是,在那之前,我正在学习如何移动窗户上的正方形。切掉咪咪,事情是这样的:

我有一个名为HeadSquare的定制JComponent类:

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被验证,它将被放置在布局管理器想要的任何位置