当我在Java中开始计算时,为什么我的GUI在java Freeze中

时间:2012-01-14 10:37:26

标签: java swing event-dispatch-thread concurrency

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

但我的应用程序在我启动应用程序的过程中冻结

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

你们有任何想法如何解决这个问题吗?

我很感激您的回复thx

伙计们我已经尝试了这个但它仍然冻结了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();

3 个答案:

答案 0 :(得分:4)

您需要查看SwingWorker

答案 1 :(得分:4)

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

此外,尽可能将Done方法中的计算尽可能多地移动到doInBackground。 Done方法在Event Dispatch Thread上执行,它会冻结GUI,特别是在运行长计算时会显而易见。

答案 2 :(得分:2)

您可以在与主GUI线程不同的线程中执行计算。这里是an article你可以看看哪些内容还涵盖了在swing应用程序中进行多线程处理时应该注意的不同内容。

相关问题