改了一下,测试通过.
    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();
        }
      });

解决方案 »

  1.   

    ((String) combo1.getSelectedItem().equals("1")
      

  2.   

    谢谢楼上wolfsquare(狼平方 Swing报表工人) 的代码,
    能否给我说说为什么吗?
      

  3.   

    up!
    各位朋友,能给我讲讲为什么这样改吗(wolfsquare的方法)?
      

  4.   

    请教 a.equals(b) 与 a==b 的区别
    http://expert.csdn.net/Expert/topic/2329/2329759.xml?temp=.5505335
      

  5.   

    Swing操作是没有同步的,不小心就会出错。
    由于不确定其他事件监听器是否使用原有UI,
    在Swing事件中尽可能的不要更新UI,而是等Swing事件线程完成后再做。
      

  6.   

    谢谢wolfsquare(狼平方 Swing报表工人)的讲解,但还有一点不懂。
    1)“由于不确定其他事件监听器是否使用原有UI”是什么意思?
    2)我是在主线程中更新UI都必须用事件派发线程吗?
    3)事件处理应该是在主线程中吧?(这里指addItemListener)
      

  7.   

    1.我指得是不确定其它组件是否引用原有UI相关的一切资源:变量,环境等,如果还不清楚的话你可以仔细研究Swing里的可替换Look&Feel框架.2.我不知道你的主线程指得是什么,前面已经说得很清楚了:
      在Swing事件中尽可能的不要更新UI,而是等Swing事件线程完成后再做
      

  8.   

    再次谢谢wolfsquare(狼平方 Swing报表工人)的讲解,我再问一句
    1)我说的主线程是main的执行线程
    2)按照你的讲解,是否事件监听器中都不能直接更新UI,都必须通过SwingUtilities.invokeLater(Swing事件派发线程)来完成?再次感谢!
      

  9.   

    1.>我是在主线程中更新UI都必须用事件派发线程吗?
      不一定的,这一点你弄清楚你指的主线程和事件派发线程区别就OK了.
    2.这个并不是强制性的,只是经验.另外我曾经看到一个资料就是Swing不是线程安全的,我想问题应该就出在这里了.由于时间隔得很久了我不记得是哪里看到的,如果你找到了请一并贴上来.