我有一个创建GUI的类,并且JComboBox
有一个ItemListener。在ItemEvent.Selected
事件中,我创建了worker并尝试将数据读入映射,但内容始终为空。
我的猜测是,这是因为线程正在执行并在线程完成之前离开ItemListener
。
我添加了相关的代码片段,希望你们能帮我确定问题所在。
private void updateUI(String text) {
StringUtilities.invokeLater(new Runnable() {
@Override
public void run() {
text.append(text + "\n");
}
}
}
private class ComboBoxListener extends ItemListener {
@Override
public void itemStateChange(ItemEvent e) {
if(e.getStateChange() == ItemEvent.DESELECTED) { return; }
if(e.getStateChange() == ItemEvent.SELECTED) {
//do stuff
Map<String, String> map = new HashMap<String, String>();
new MyWorker(var1, var2) {
@Override
public updateUI(String text) {
updateMainUI(text);
}
@Override
public updateMap(String name, String value) {
map.put(name, value);
}
}.execute();
for(Map.Entry<String, String> entry : map.entrySet()) {
// do something with map contents
}
}
}
}
updateUI
和updateMap
是MyWorker
中我抽象的抽象方法,以便我可以向gui发送更新。
简而言之,我怎样才能从工作人员那里获取数据,以便在事件完成之前我可以执行?
我从内存中写了大部分内容,因为我目前没有实际代码在我面前,所以请忽略小错别字和语法问题。
答案 0 :(得分:4)
SwingWorker
在另一个线程上异步执行其doInBackground()
方法;结果将在未来的不确定时间提供,但您需要立即检查地图条目。相反,publish()
Map.Entry<String, String>
每个doInBackground()
在process()
和JLabel
可用时都可用。
如果中间结果可以有效地显示在另一个组件中,请更新该组件的模型,如done()
所示Icon
的文本。如果没有,请覆盖{{1}}以使用完成的结果,如此处所示{{1}}。