java thread.sleep把摆动用户也睡觉

我即时创build一个简单的testing应用程序,每隔一小时通过JFileChooser使用thread.sleep()在所选目录上运行检查。 但是,当我select目录和方法运行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(结果)中运行的检查的结果。

对于让用户界面进入睡眠状态的代码是正确的。 由于在事件派发线程(负责运行GUI的线程)上调用sleep所以UI停止处理事件并“进入睡眠”状态。

我想你想要的是一个javax.swing.Timer

 Timer t = new Timer(1000 * 5, new ActionListener() { public void actionPerformed(ActionEvent e) { // do your reoccuring task } }); 

这将导致您的重复执行的任务从EDT执行,因此它不会让您的用户界面无响应。

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

这是因为你正在运行你检查主要的GUI线程,并使用无限循环。 这个检查是一个后台任务,应该在它自己的线程中执行,这样GUI仍然可以接收和响应用户的input。

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

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