java thread.sleep也让swing ui进入睡眠状态

java thread.sleep也让swing ui进入睡眠状态,java,multithreading,swing,Java,Multithreading,Swing,我正在创建一个简单的测试应用程序,它通过JFileChooser使用thread.sleep()每小时在所选目录上运行一次检查。但当我选择目录并运行方法时,ui面板变灰,摆动位消失。线程似乎正在使ui及其调用的方法处于休眠状态 if (option == JFileChooser.APPROVE_OPTION) { selectedDirectory = chooser.getSelectedFiles(); try { while (true) {

我正在创建一个简单的测试应用程序,它通过JFileChooser使用thread.sleep()每小时在所选目录上运行一次检查。但当我选择目录并运行方法时,ui面板变灰,摆动位消失。线程似乎正在使ui及其调用的方法处于休眠状态

if (option == JFileChooser.APPROVE_OPTION) {
    selectedDirectory = chooser.getSelectedFiles();
    try {
        while (true) {
            runCheck(selectedDirectory);
            Thread.sleep(1000*5);//1000 is 1 second
        }
    } catch (InterruptedException e1) {
        Thread.currentThread().interrupt();
        e1.printStackTrace();
    }               
} 

我正在寻找解决这个问题的方法,这样我就可以打印ui中运行的检查结果。setText(result)

如果您发布的代码在EventDispatchThread上运行,那么Swing就无法重新绘制GUI。你在阻塞(睡在)应该处理这个问题的线程

这是因为您正在运行签入主GUI线程,并且正在使用无限循环。此检查是一项后台任务,应该在自己的线程中执行,以便GUI仍然可以接收用户的输入并对其作出反应

您也不需要编写自己的实现,Java有一个对象


编辑:还有一个特定于Swing的对象。这将使操作发生在GUI线程中,因此如果任务很长,则会导致GUI在操作发生时(但不是在等待时)仍然锁定。

关于使UI进入睡眠状态的代码,您是正确的。由于在事件调度线程(负责运行gui的线程)上调用了
sleep
,因此UI停止处理事件并“进入睡眠”

我想你想要的是一个


这将导致您的重复任务在EDT之外执行,因此不会使您的ui无响应。

可能
SwingWorker
?考虑使用计时器和TimeTebug来运行定时任务。它会更可靠。@Andrew,实际上应该使用
javax.swing.Timer
而不是util包中的计时器。@jjnguy,我只是想指出,一般来说,在while循环中使用sleep并不是一种及时重复任务的好方法,还有一种更可靠的方法。但是,是的,你在这种情况下是正确的p您链接到的计时器是
util
包中的计时器。与swing组件交互时,应使用swing
计时器
“请注意,swing计时器的任务是在事件分派线程中执行的。这意味着任务可以安全地操作组件,但也意味着任务应该快速执行。”
Timer t = new Timer(1000 * 5, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do your reoccuring task
    }
});