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

2024-01-02

我有一个 Swing 应用程序,它存储对象列表。当用户点击按钮时,

我想对列表中的每个对象执行两个操作,然后完成后在 JPanel 中绘制结果图。我一直在尝试使用 SwingWorker、Callable 和 Runnable 来进行处理,但无论我做什么,在处理列表时(可能需要几分钟,因为它是 IO 绑定的),GUI 都会被锁定。

我有一种感觉,这可能是我调用线程或其他东西的方式,或者可能与绘图函数有关?这不是线程,因为它非常快。

我也必须按顺序执行两个处理阶段,那么确保第二个处理阶段等待第一个处理阶段的最佳方法是什么?我用过 join(),然后

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

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

我一直在到处寻找一些指示,但由于我找不到任何指示,所以我确信我在这里做了一些愚蠢的事情。


问题是,您的长时间运行的任务正在阻塞保持 GUI 响应的线程。

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

执行此操作的一些常见方法是使用计时器或SwingWorker http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html.

The Java教程 http://java.sun.com/docs/books/tutorial/uiswing/concurrency/在他们的并发课上有很多关于这些事情的信息。

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

以下是针对您的案例的 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并告诉它开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 Swing GUI 在后台任务期间锁定 的相关文章

随机推荐