java – 在后台任务中防止Swing GUI锁定

我有一个摆放应用程序存储一个对象列表.当用户点击一个按钮时,

我想对列表中的每个对象执行两个操作,然后一次完成,将结果映射到JPanel中.我一直在尝试SwingWorker,Callable& Runnable做处理,但无论我做什么,在处理列表(可能需要几分钟,因为它是IO绑定),GUI被锁定.

我有一种感觉,这可能是我调用线程或某事的方式,还是可以用图形函数?那是没有线程,因为它是非常快的.

我也要按顺序做两个处理阶段,那么确保第二个处理阶段的最佳方法是什么呢?我使用了join(),然后

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

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

我一直在寻找无处不在的一些指针,但由于我找不到任何我确信我在这里做一些愚蠢的事情.

问题是,长时间运行的任务是阻止线程保持GUI响应.

你需要做的是将长时间运行的任务放在另一个线程上.

一些常见的方法是使用Timers或SwingWorker.

Java tutorials在并发课程中有很多关于这些事情的信息.

为了确保第一个任务在第二个任务之前完成,只需将它们放在同一个线程上.这样你就不必担心保持两个不同的线程正确计时.

以下是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并告诉它启动.

翻译自:https://stackoverflow.com/questions/940913/prevent-swing-gui-locking-up-during-a-background-task

转载注明原文:java – 在后台任务中防止Swing GUI锁定