0

我只是在用 GUI 做一些随机的事情,我遇到了这个问题。当我按下右箭头键时,矩形确实在 X 轴上移动,但移动的距离不是恒定的。它上升得很快,每次按下更大的移动后矩形都会移动。在我最近的代码行X=X+1似乎工作得很好。这是我的代码:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;


public class Buffer extends JPanel implements KeyListener{
public static JFrame frame;
public int x;

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.red);
    g.fillRect(x,0,20,20);
    frame.addKeyListener(this);
}




public static void main(String args[]){
    Buffer z=new Buffer();

    frame=new JFrame();
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setFocusable(true);
    frame.add(z);
}
@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
        x=x+1;
        repaint();
    }

}
    }
4

2 回答 2

1

删除以下行public void paintComponent(Graphics g)

frame.addKeyListener(this);

并将以下行添加到public static void main(String args[])

frame.addKeyListener(z);

问题是每次repaint();通过该keyPressed方法后,该方法都会向您的框架paintComponent添加一个新的。 但是如果你有几个,每个 Listener 都会为同一个事件调用该方法。因此,如果您有 5 个侦听器并且您按一次向右箭头,则该方法被调用五次并且 x 增加 5。 这意味着矩形随着向右箭头的每一次击中而移动得更快一些。 KeyListener
KeyListenerskeyPressedkeyPressed

于 2013-07-14T19:22:19.340 回答
-1

尝试keyReleased代替keyPressed. 可能是在按下键时,它会不断调用keyPressed事件。

于 2013-07-14T18:44:51.303 回答