java - 使用 Swing 移动图像

标签 java image swing

我想在按下箭头键时将图像在屏幕上向右移动 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();
         }
    }
}

最佳答案

问题是你在 EDT(事件调度线程)内 sleep 。 repaint() 触发一个事件,该事件将由 EDT 调度,然后执行组件的实际重绘。由于您阻止了 EDT,因此重绘不会直接执行(但在所有代码结束后,会发生一个重绘事件(因为重绘事件会尽可能分组)。您可能需要使用 SwingWorker 来解决此问题。

关于java - 使用 Swing 移动图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254702/

相关文章:

java - 如何在PDFBox中为PDListBox设置多个选项?

java - Maven 将同级项目的二进制文件作为打包的一部分包含在内

c# - 在延续中使用一个对象,确保它在你需要它之​​前不会被释放

python - 给定一个二维 numpy 实数数组,如何生成描述每个数字强度的图像?

java - 调用 JButton actionperformed 事件时返回一个值

java - 即使捕获了运行时异常,也会抛出它们吗?

Java基本线程池带锁的实现.ReentrantLock

android - 16571536 字节分配内存不足

java - Jlist 和 NullPointerException

java - JFrame 展开后,JPanel 才会显示