2

我正在编写一个应用程序来解析XML文件(连续)并在 GUI(Swing)中显示数据。ParseThread是在,CoreProject而是GUIGUIProject

的开头通过 ItemListenerParseThread连接到 a 。JCheckBoxMenuItem的值setSelected()是在添加到菜单后直接设置的。此时 GUI 不包含Component需要ParseThread显示已解析数据的内容。

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

4

2 回答 2

3

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

在 Swing 中遇到了 Concurency问题,您的艰苦而长期运行的任务应该移至后台任务,对于 Swing 有两种可能性

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

  • 使用SwingWorker

编辑

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

使用 invokeLater() 在调用之前我无法确定组件是否存在

  1. 创建图形用户界面,

  2. 显示图形用户界面,

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

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

于 2012-07-01T12:58:26.527 回答
2

Ok, I got my problem... The GUI is created like this:

EventQueue.invokeAndWait(new Runnable() {

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

And at construction of the Object Mainframe this code will be executed:

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);
        }
    });

So the ParseThread will start after GUI is build.

Sorry for stealing your time

于 2012-07-01T13:46:49.407 回答