【问题标题】:Rectangle X axis move issue矩形X轴移动问题
【发布时间】:2013-07-14 18:35:39
【问题描述】:

我只是用 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();
    }

}
    }

【问题讨论】:

  • 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings
  • 扩展 Andrew 的评论,您还可以查看 Motion Using the Keyboard 了解一些想法。

标签: java swing jpanel keylistener rect


【解决方案1】:

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

frame.addKeyListener(this);

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

frame.addKeyListener(z);

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是要走的路!如果按键被按住,某些系统(基于 AFAIR L*nux)将多次触发按键/按键释放事件。
    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多