2012-07-01 86 views
2

我正在编写一个应用程序,它分析XML文件(连续)并在GUI(Swing)中显示数据。 ParseThreadCoreProject中,并且GUIGUIProject中。Java:让其他线程知道GUI是否可以使用

使用ItemListener将ParseThread的开头连接到JCheckBoxMenuItem。在添加到菜单后直接设置setSelected()的值。此时GUI不包含需要显示解析数据的Component

我的解决方案是,ParseThread应该等到完全构建GUI。 我想到了像EventQueue这样的东西,但我不知道如何编码。

+3

你为什么不在GUI准备好后开始你的线程? – GETah

+0

同意 - 我不确定你确切的问题是什么,尽管听起来你可以使用SwingWorker做一个额外的PropertyChangeListener的后台处理来通知GUI线程的进度。 –

+1

是的,直到所有需要运行的数据(直接)都存在,我才看到创建线程的任何一点。也就是说,GUI组件不应该属于那个类别 - 如果通过通常的方式通过消息传递GUI,这个问题不应该发生? –

回答

3

我的解决方案是,ParseThread应该等到GUI完全建立。我想到了像EventQueue这样的东西,但我不知道如何编码。

你有问题与Concurency in Swing,您的硬盘和长期运行的任务应该被移动到后台任务,为Swing有两种可能性

  • (易&简单)使用Runnable#Thread,输出到Swing GUI必须包装成invokeLater(),包括线程安全方法,如setText,append ei

  • 使用SwingWorker

编辑

请检查我的visulaizations为Runnable#Thread,这是同样的事情,你连接服务器,解析长文件EI,

用的invokeLater( )我不能确定该组件是否存在,直到致电

  1. 创建GUI,

  2. 显示GUI,

  3. 一些(Swing/Util) Timeruser action调用是/重定向出Swing EventDispatchThread代码,为此有Runnable#ThreadSwingWorker

  4. 我建议两种最简单的方法

+0

with invokeLater()我无法确定该组件是否存在,直到电话 – nidomiro

+0

请在这里看到我的编辑 – mKorbel

2

好的,我得到了我的问题... 的GUI创建这样的:

EventQueue.invokeAndWait(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        Mainframe frame = new Mainframe(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

而且在施工对象大型机这段代码会被执行的:

final JCheckBoxMenuItem chckbxmntmParsing = new JCheckBoxMenuItem("Parsing"); 
    chckbxmntmParsing.setName("mainframe.menu.data.parsing"); 
    localeChangedListener.add(chckbxmntmParsing); 

    chckbxmntmParsing.addItemListener(new ItemListener() { 

     @Override 
     public void itemStateChanged(ItemEvent e) { 
      if (chckbxmntmParsing.isSelected()) { 
       parseManager.startParsing(); 
      } else { 
       parseManager.stopParsing(); 
      } 
     } 
    }); 

    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      boolean enabled = false; 
      String prop = PropertyManager.get().getProperty("parser.continuousparsing.enabled"); 
      if (prop != null) { 
       if (prop.trim().equals("true") || prop.trim().equals("1")) { 
        enabled = true; 
       } 
      } 
      chckbxmntmParsing.setSelected(enabled); 
     } 
    }); 

所以ParseThread会开始后的GUI是构建。

对不起,偷你的时间

+2

*“对不起,因为你偷了你的时间”*只为我讲话(没有人要求我为他们说话),但道歉不接受因为你不欠我一个。相反,**谢谢**为您自己的问题提供答案!非常适合问答网站。 :) –

相关问题