一尘不染

防止在后台任务期间锁定Swing GUI

java

我有一个可以存储对象列表的swing应用程序。当用户单击按钮时,

我想对列表中的每个对象执行两项操作,然后完成操作,然后在JPanel中绘制结果图。我一直在尝试SwingWorker,Callable和Runnable进行处理,但是无论我做什么,在处理列表(由于绑定到IO最多可能需要几分钟的时间)时,GUI都被锁定了。

我感觉这可能是我调用线程或某种方式的方式,或者可能与图形功能有关?这不是线程化的,因为它很快。

我也必须依次执行两个处理阶段,所以确保第二个已经等待第一个的最佳方法是什么?我用过join(),然后

while(x.isAlive())  
{  
        Thread.sleep(1000);  
}

尝试确保这一点,但我担心这也可能是我遇到问题的原因。

我一直在到处寻找一些指针,但是由于找不到任何指针,因此我确定自己在这里做一些愚蠢的事情。


阅读 332

收藏
2020-09-08

共1个答案

一尘不染

问题是,您长期运行的任务正在阻塞使GUI保持响应状态的线程。

您需要做的是将长期运行的任务放在另一个线程上。

一些常用的方法是使用Timers或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并告诉它启动。

2020-09-08