有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带Swing的java移动图像

我想在按下箭头键时将屏幕上的图像向右移动16。我想以1px/10ms的速度移动它,直到到达该点。该映像是在作为JPanel子级的类中创建的。 我编写了下一个代码,但图像不稳定地改变了位置,而不是移动:

public class Test extends JFrame implements KeyListener {
    private int x=0;
    private int y=0;
    BufferedImage img;
    ...
    ...
    public void paint(Graphics g){
        g.drawImage(img,x,y,null);
    }
    // Move to a point 16 pixels to right
    public void moveRight(){
        for(int i=0;i<16;i++){
            x++;
            repaint();
            try {
                Thread.sleep(10); // Sleep 10 milliseconds until next position change
            }catch (InterruptedException e) {}
        }
    }

    public void keyPressed(KeyEvent e) {
         if(e.getKeyCode()==KeyEvent.VK_RIGHT){
             moveRight();
         }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    如果在另一个线程中调用moveRight()会怎么样

    试试这个:

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){
            new Thread(new Runnable(){
                public void run(){
                    moveRight();
                }
            }).start();
        }
    }
    

    我还没有测试过,我甚至不知道这是不是一个好办法

  2. # 2 楼答案

    问题在于您在EDT(事件调度线程)内的睡眠repaint()触发一个事件,该事件将由EDT调度,并反过来执行组件的实际重新绘制。由于您正在阻止EDT,因此重绘不会直接执行(但在所有代码结束后,会发生一个重绘事件(因为重绘事件在任何可能的情况下都会分组)。您可能需要使用SwingWorker来解决此问题