【发布时间】: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