2013-07-14 28 views
0

我只是在做随机的东西与GUI,我来到这个问题。当我按右箭头键,矩形真的在X轴上移动,但距离移动不是恒定的。它提高很快,矩形并经过各按大moves.In我最近的代码行X=X+1似乎工作得fine.Here是我的代码:矩形X轴移动问题

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

} 
    } 
+1

对于Swing,通常使用基于AWT的较低级别KeyListener的键绑定。有关如何使用它们的详细信息,请参见[如何使用键绑定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 –

+0

扩展Andrew的评论,你也可以查看[Motion Using the Keyboard](http://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/)了解一些想法。 – camickr

回答

1

public void paintComponent(Graphics g)

frame.addKeyListener(this); 

删除下面的行和下面的行添加到public static void main(String args[])

frame.addKeyListener(z); 

的问题是,后每repaint();通过keyPressed方法,所述paintComponent方法增加了一个新KeyListener到你的框架。
但是,如果您有几个KeyListeners,则每个侦听器将调用相同事件的keyPressed方法。因此,如果您有5个听众,并且您按一次右箭头,则会调用keyPressed方法五次,并将x递增五。
这意味着矩形会随着右箭头的每次击中而快速移动。

+0

谢谢你亲切的先生! :) –

-1

尝试keyReleased,而不是keyPressed。它可能是这样的,当键被按下时,它一直调用keyPressed事件。

+0

这不是要走的路!如果按住键,某些系统(基于AFAIR L * nux)将多次触发按键/按键释放事件。 –