我目前正在开发一个小程序,它收集一个网站的匹配列表,我将其提供给我的GUI的jList。
我想循环一个刷新列表元素的方法,以便匹配在完成后不会显示在列表中。为此,我需要让循环一直运行,但这会导致GUI冻结。
我试图找到一种解决方法并阅读一些关于Timer的内容,这对我来说并不适合我并创建一个新的Thread但是这对我的列表不起作用,因为它在第一个循环之后超出界限。
我检查过它与我调用的方法无关,所以需要循环的方法不是问题。
有没有人知道如何在不冻结整个GUI的情况下循环方法。像这样的东西
while (true) {
dlm.removeAllElements(); //To remove all elements from the List
getMatches(); //Adds the matches to dlm whic
sleep(6000); //wait 6 seconds to refresh
}
这是我用来测试不会崩溃的循环的代码。
new Thread(new Runnable() {
public void run() {
while (true) {
dlm.removeAllElements(); //To remove all elements from the List
getMatches(); //Adds the matches to dlm whic
sleep(6000); //wait 6 seconds to refresh
}
};
}).start();
答案 0 :(得分:2)
首先看看Concurrency in Swing,特别是Worker Threads中的部分。
根据有限的代码,我还建议您查看How to use Swing Timers
请记住,Swing不是线程安全的,而且是单线程的。这意味着(正如您所发现的)您不应在事件调度线程的上下文中执行长时间运行或阻塞操作。您不应该在事件调度线程的上下文之外更新UI。
两种解决方案(SwingWorker
和Swing Timer
)都提供了让您在更新UI之前等待一段时间的方法,您使用的最终将取决于您的整体问题