Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在按键后是否立即继续移动?_Java_Swing_Keyboard - Fatal编程技术网

Java在按键后是否立即继续移动?

Java在按键后是否立即继续移动?,java,swing,keyboard,Java,Swing,Keyboard,当我按下任何键箭头时,红色框移动,是的,移动10px,然后停止1秒&继续移动,而不是不停地立即移动 发生问题的示例: (来源:) 你能看到它是如何停止1秒或0.5秒并继续的吗 我怎样才能修好它 我正在使用KeyEventDispatcher 我的钥匙检测: 整个src: public class Game extends Frame { private class Keyboard implements KeyEventDispatcher { private Ga

当我按下任何键箭头时,红色框移动,是的,移动10px,然后停止1秒&继续移动,而不是不停地立即移动

发生问题的示例:


(来源:)

你能看到它是如何停止1秒或0.5秒并继续的吗

我怎样才能修好它

我正在使用
KeyEventDispatcher

我的钥匙检测:

整个src:

public class Game extends Frame {

    private class Keyboard implements KeyEventDispatcher {

        private Game game;

        public Keyboard(Game game) {
            this.game = game;
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_PRESSED) {
                this.movement(e);
            } else if (e.getID() == KeyEvent.KEY_RELEASED) {
            } else if (e.getID() == KeyEvent.KEY_TYPED) {
            }
            return false;
        }

        public void movement(KeyEvent e) {
            int keyCode = e.getKeyCode();
            switch( keyCode ) { 
                case KeyEvent.VK_UP:
                    game.movePlayer(0, -10);
                    break;
                case KeyEvent.VK_DOWN:
                    game.movePlayer(0, 10);
                    break;
                case KeyEvent.VK_LEFT:
                    game.movePlayer(-10, 0);
                    break;
                case KeyEvent.VK_RIGHT :
                    game.movePlayer(10, 0);
                    break;
             }
        }   
    }

    private static final long serialVersionUID = 1L;

    private int coordinateX = 1;
    private int coordinateY = 1;

    public int width = 300;
    public int height = width / 16 * 9;
    public int scale = 3;   
    public int mouseY = MouseInfo.getPointerInfo().getLocation().y;
    public int mouseX = MouseInfo.getPointerInfo().getLocation().x; 
    private Player player = new Player(0, 0);

    public Game() {
        Dimension size = new Dimension(width * scale, height * scale);
        setPreferredSize(size);     
        frame.setSize(width, height);
        frame.setResizable(false);
        frame.setTitle("First game");
        JPanel j = new JPanel();
        j.setVisible(true);
        JLabel text = new JLabel("coords");
        j.add(text);
        frame.add(this);
        frame.pack();
        frame.add(j);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.addKeyEventDispatcher(new Keyboard(this));      
    }

    private void movePlayer(int x, int y) {
        /**
         * Main region area
         */

        int pX = 0, pY = 0;
        if (y == 0) { // x
            if (player.getX() + x + 100 > frame.getContentPane().getWidth() || player.getX()  + x < 0) {
                if (player.getX() + x < 0) {
                    player.setX(0);
                    return;
                }
                if (player.getX() + x > 0) {
                    player.setX(frame.getContentPane().getWidth() - 100);
                    return;
                }
                return;
            }

            pX = x;

        }
        else if (x == 0) { // y
            if (player.getY() + y + 100 > frame.getContentPane().getHeight() || player.getY()  + y < 0) {
                if (player.getY() + y < 0) {
                    player.setY(0);
                    return;
                }               
                if (player.getY() + y > 0) {
                    player.setY(frame.getContentPane().getHeight() - 100);
                    return;
                }
                return;
            }        
            pY = y;
        }

        player.updatePosition(pX, pY);
    }  

    public void update() {

    }

    public void render() {
        bs = getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }
        g = bs.getDrawGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(Color.RED);
        g.fillRect(player.getX(), player.getY(), 100, 100);
        g.dispose();
        bs.show();
    }   

}

问题在于击键的重复率。这是由操作系统控制的

解决方案是在按下该键后立即使用摆动计时器来安排动画

有关更多信息和完整的工作示例,请参见


另外,您不应该使用KeyListener,但intead应该使用KeyBinding。

我认为问题不在您提供的代码范围之内。构建SSCCE将为您解决问题,或者为其他人提供他们需要的信息。@jzd信息,比如什么?我真的不知道是什么代码导致了这个问题,但我很确定这是我为自己的需要所做的错误的关键事件。没有SSCCE,很难诊断问题。更新延迟指向的不是KeyEvent处理。
public class Frame extends Canvas {

    public static final long serialVersionUID = 8L;

    public static JFrame frame = new JFrame();
    public static Threads thread;
    public static Game game;
    public Graphics g;
    public BufferStrategy bs;


    /**
     * @param args
     */

    public static void main(String[] args) {
        thread = new Threads(new Game());
        thread.start();
    }
}