Java:让其他线程知道GUI是否可以使用

时间:2012-07-01 12:42:11

标签: java multithreading swing user-interface ready

我正在编写一个解析XML个文件(连续)并在GUI(Swing)中显示数据的应用程序。 ParseThread位于CoreProjectGUI位于GUIProject

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

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

2 个答案:

答案 0 :(得分:3)

  

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

你有Concurency in Swing的问题,你的艰苦和长期运行的任务应该转移到后台任务,对于Swing有两种可能性

  • (简单和简单)使用Runnable#Thread,输出到Swing GUI必须包含在invokeLater()中,包括线索安全方法setTextappend EI

  • 使用SwingWorker

修改

请检查我Runnable#Thread的可视化,这与连接服务器是一样的,解析长文件e.i.,

  

使用invokeLater()在调用

之前,我无法确定该组件是否存在
  1. 创建GUI,

  2. 显示GUI,

  3. 部分(Swing / Util) Timeruser action调用从Swing EventDispatchThread重定向的代码,因此有Runnable#ThreadSwingWorker

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

答案 1 :(得分: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);
        }
    });

因此,在构建GUI之后,ParseThread将启动。

抱歉偷你的时间