0

GUIでランダムなことをしていたところ、この問題に遭遇しました.右矢印キーを押すと、長方形は実際にX軸上を移動しますが、移動距離は一定ではありません.かなり速く上昇し、押すたびに長方形が大きく動きます.私の最近のコード行X=X+1はかなりうまくいくように見えました.Hereは私のコードです:

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();に、メソッドがフレームに新しい を追加したことです。 ただし、複数の がある場合、すべてのリスナーが同じイベントのメソッドを呼び出します。したがって、5 つのリスナーがあり、右矢印を 1 回押すと、メソッドが 5 回呼び出され、x が 5 ずつ増加します。 これは、右矢印を押すたびに長方形が少し速く移動したことを意味します。 keyPressedpaintComponentKeyListener
KeyListenerskeyPressedkeyPressed

于 2013-07-14T19:22:19.340 に答える
-1

keyReleasedの代わりに試してくださいkeyPressed。キーが押されている間、keyPressedイベントを呼び出し続ける可能性があります。

于 2013-07-14T18:44:51.303 に答える