使用SwingWorker时从地图中检索数据

时间:2014-07-27 00:58:09

标签: java multithreading swing user-interface swingworker

我有一个创建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
       }
     }
   }
}

updateUIupdateMapMyWorker中我抽象的抽象方法,以便我可以向gui发送更新。

简而言之,我怎样才能从工作人员那里获取数据,以便在事件完成之前我可以执行

我从内存中写了大部分内容,因为我目前没有实际代码在我面前,所以请忽略小错别字和语法问题。

1 个答案:

答案 0 :(得分:4)

SwingWorker在另一个线程上异步执行其doInBackground()方法;结果将在未来的不确定时间提供,但您需要立即检查地图条目。相反,publish() Map.Entry<String, String>每个doInBackground()process()JLabel可用时都可用。

如果中间结果可以有效地显示在另一个组件中,请更新该组件的模型,如done()所示Icon的文本。如果没有,请覆盖{{1}}以使用完成的结果,如此处所示{{1}}。