改了一下,测试通过.
combo1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
if ((String) combo1.getSelectedItem() == "1") {
setMotifUIStyle();
} if ((String) combo1.getSelectedItem() == "2") {
setMetalUIStyle();
}
}
}); // setMotifUIStyle();
}
});
combo1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
if ((String) combo1.getSelectedItem() == "1") {
setMotifUIStyle();
} if ((String) combo1.getSelectedItem() == "2") {
setMetalUIStyle();
}
}
}); // setMotifUIStyle();
}
});
能否给我说说为什么吗?
各位朋友,能给我讲讲为什么这样改吗(wolfsquare的方法)?
http://expert.csdn.net/Expert/topic/2329/2329759.xml?temp=.5505335
由于不确定其他事件监听器是否使用原有UI,
在Swing事件中尽可能的不要更新UI,而是等Swing事件线程完成后再做。
1)“由于不确定其他事件监听器是否使用原有UI”是什么意思?
2)我是在主线程中更新UI都必须用事件派发线程吗?
3)事件处理应该是在主线程中吧?(这里指addItemListener)
在Swing事件中尽可能的不要更新UI,而是等Swing事件线程完成后再做
1)我说的主线程是main的执行线程
2)按照你的讲解,是否事件监听器中都不能直接更新UI,都必须通过SwingUtilities.invokeLater(Swing事件派发线程)来完成?再次感谢!
不一定的,这一点你弄清楚你指的主线程和事件派发线程区别就OK了.
2.这个并不是强制性的,只是经验.另外我曾经看到一个资料就是Swing不是线程安全的,我想问题应该就出在这里了.由于时间隔得很久了我不记得是哪里看到的,如果你找到了请一并贴上来.