我正在编写一个解析XML
个文件(连续)并在GUI(Swing
)中显示数据的应用程序。 ParseThread
位于CoreProject
,GUI
位于GUIProject
。
ParseThread
的开头通过ItemListener连接到JCheckBoxMenuItem
。添加到菜单后,将直接设置setSelected()
的值。此时,GUI不包含Component
,ParseThread
需要显示已解析的数据。
我的解决方案是,ParseThread
应该等到完全构建GUI。
我想到了像EventQueue这样的东西,但我不知道如何编写一个。
答案 0 :(得分:3)
我的解决方案是,ParseThread应该等到完全构建GUI。我想到了像EventQueue这样的东西,但我不知道如何编写一个。
你有Concurency in Swing的问题,你的艰苦和长期运行的任务应该转移到后台任务,对于Swing有两种可能性
(简单和简单)使用Runnable#Thread
,输出到Swing GUI必须包含在invokeLater()
中,包括线索安全方法setText
,append
EI
修改
请检查我Runnable#Thread的可视化,这与连接服务器是一样的,解析长文件e.i.,
使用invokeLater()在调用
之前,我无法确定该组件是否存在
创建GUI,
显示GUI,
部分(Swing / Util) Timer
或user action
调用从Swing EventDispatchThread
重定向的代码,因此有Runnable#Thread
或SwingWorker
我建议两种最简单的方法
答案 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将启动。
抱歉偷你的时间