【问题标题】:Thread.sleep(1000) not working in SwingThread.sleep(1000) 在 Swing 中不起作用
【发布时间】:2012-11-21 05:18:36
【问题描述】:

我在 java swing 中有一个简单的动画程序。但它不起作用。

    try{
    for(int i = 1; i<=500; i++){    
    ImageIcon icon = new ImageIcon("img\\COVERFront.jpg");
    Image image = icon.getImage();
    Image scaled =  image.getScaledInstance(400, i, 0);
    jLabel2.setIcon(new ImageIcon(scaled));
    Thread.sleep(1000);
    }
    }
    catch(InterruptedException ie){}

我正在使用 netbeans 7.1。

【问题讨论】:

  • “它不工作”是什么意思?它在做什么?你希望它做什么?
  • 它应该做什么?顺便说一句,线程在 GUI 上的工作方式与在控制台程序上的工作方式略有不同。
  • 查看Event Dispatch Thread。这可能是你的问题。
  • Swing tag wiki 有一个指向动画示例/教程的链接

标签: java multithreading swing animation


【解决方案1】:

从您的代码中,我了解到您正在尝试通过增加(放大)图标的大小来为图标设置动画。 然而,由于睡眠任务是在事件调度线程 (EDT) 上完成的,因此会导致 GUI 冻结。因此,不应在 Event Dispatch Thread 上运行诸如 Thread.sleep() 之类的所有耗时任务。

考虑使用SwingUtilitiestimer

【讨论】:

    【解决方案2】:

    只需将整个 for 循环放在一个线程中。像

    new Thread(){
        for(int i = 1; i<=500; i++){    
            ImageIcon icon = new ImageIcon("img\\COVERFront.jpg");
            Image image = icon.getImage();
            Image scaled =  image.getScaledInstance(400, i, 0);
            jLabel2.setIcon(new ImageIcon(scaled));
            Thread.sleep(1000);
        }
    }
    

    这样就可以了。您尝试在 Event Dispatcher 线程中设置相同的动画是唯一的问题。

    【讨论】:

    • 这可能会起作用,有时...通过访问另一个线程上的 Swing 组件来违反 Swing 线程规则不是一个好主意。
    • @Robin 那么我该如何推进呢?
    • 看@Algortihms 的回答。您需要在单独的线程上休眠并在 EDT 上执行摇摆操作。这可以通过使用SwingUtilities 类或使用javax.swing.Timer 来完成(您可以设置延迟而不是使用Thread.sleep
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2012-12-15
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多