我有一个可以存储对象列表的swing应用程序。当用户单击按钮时,
我想对列表中的每个对象执行两项操作,然后完成操作,然后在JPanel中绘制结果图。我一直在尝试SwingWorker,Callable和Runnable进行处理,但是无论我做什么,在处理列表(由于绑定到IO最多可能需要几分钟的时间)时,GUI都被锁定了。
我感觉这可能是我调用线程或某种方式的方式,或者可能与图形功能有关?这不是线程化的,因为它很快。
我也必须依次执行两个处理阶段,所以确保第二个已经等待第一个的最佳方法是什么?我用过join(),然后
while(x.isAlive()) { Thread.sleep(1000); }
尝试确保这一点,但我担心这也可能是我遇到问题的原因。
我一直在到处寻找一些指针,但是由于找不到任何指针,因此我确定自己在这里做一些愚蠢的事情。
问题是,您长期运行的任务正在阻塞使GUI保持响应状态的线程。
您需要做的是将长期运行的任务放在另一个线程上。
一些常用的方法是使用Timers或SwingWorker。
SwingWorker
在Java教程有很多关于这些东西在他们的并发教训的信息。
要确保第一个任务在第二个任务之前完成,只需将它们都放在同一线程上即可。这样,您不必担心保持两个不同的线程正确计时。
这是您的情况的SwingWorker的示例实现:
public class YourTaskSwingWorkerSwingWorker extends SwingWorker<List<Object>, Void> { private List<Object> list public YourClassSwingWorker(List<Object> theOriginalList){ list = theOriginalList; } @Override public List<Object> doInBackground() { // Do the first opperation on the list // Do the second opperation on the list return list; } @Override public void done() { // Update the GUI with the updated list. } }
要使用此代码,当触发修改列表的事件时,请创建一个新的SwingWorker并告诉它启动。