【问题标题】:Why my GUI in java Freeze when I start calculation in Java为什么我在 Java 中开始计算时我在 Java 中的 GUI 冻结
【发布时间】:2012-01-14 10:37:26
【问题描述】:

我正在开发一个java应用程序

但是当我开始我的申请过程时我的申请冻结

因此我可以在此过程中更新我的 GUI

你们知道如何解决这个问题吗?

感谢您的回复,谢谢

伙计们,我已经尝试过了,但它仍然会冻结 GUI

这是我的代码

final String key = keywords;
        final int dept = dep;
        final double rele = relevance;

        SwingWorker worker = new SwingWorker<Map, Void>() {
            @Override
            public Map doInBackground() {
                final Map resultMap = focusedCrawlingMain.Search(key, dept, rele);  

                return resultMap;
            }

            public void Done(Map dataMap) {
                final List resultList = (List) dataMap.get("relevantList");
                List resultListValue = (List) dataMap.get("relevantListScore");
                int size = resultList.size();

                newData = new String[size][3];
                for(int i = 0; i < size; i++){
                    newData[i][0] = String.valueOf(i+1);
                    newData[i][1] = String.valueOf(resultList.get(i));
                    newData[i][2] = String.valueOf(resultListValue.get(i));
                    model.addRow((new Object[]{newData[i][0],newData[i][1],newData[i][2]}));
                }
            }
        };
        worker.run();

【问题讨论】:

  • 为什么这不是一个真正的问题?在我看来,这是一个非常好的问题,但它可能已经被问过很多次了。
  • @Carlo :我真的不太了解 SwingWorker 的事情,但你为什么不按照 Darin Dimitrov 的建议从你的 main 方法开始一个新线程,并在那个线程中执行你的计算,那赢了不要让您的 GUI 以任何方式冻结。问候
  • @Gagandeep Bali,因为我不知道如何使用多线程,你能告诉我吗?
  • @Carlo :只需创建一个实现 Runnable 的新类,并在它的 run 方法中进行计算。在你的 main 方法中,写这个 Thread threadName = new Thread(new CalculationClass());线程名.start();我猜会这样。问候
  • @GagandeepBali 在你的 main 方法中,写这个 Thread threadName = new Thread(....) ... .start() 错误(或者至少只有一半故事)谈到 Swing:最后,必须更新 ui 的属性,并且更新必须发生在 EDT 上。这就是 SwingWorker 提供帮助的地方,因为它允许干净地将后台线程和 EDT 分开并管理从前者到后者的通信

标签: java swing event-dispatch-thread concurrency


【解决方案1】:

你需要看SwingWorker

【讨论】:

    【解决方案2】:

    我相信 worker.run() 可能会造成一些麻烦。如果我没有误解您的代码,您实际上应该调用 worker.execute()。

    此外,尽可能将 Done 方法中的计算转移到 doInBackground。 Done 方法在 Event Dispatch Thread 上执行,这会冻结 GUI,在运行长时间计算时尤其明显。

    【讨论】:

    • good catch :-) 问题中的另一个小问题: Done 永远不会被调用,因为它不会覆盖任何超级方法...
    【解决方案3】:

    您可以在与主 GUI 线程不同的线程中执行计算。这是an article,您可以看看它还涵盖了在 Swing 应用程序中执行多线程时应该注意的不同事项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 2017-12-22
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多