是否用了awt和swing的混合界面?

解决方案 »

  1.   

    除了AWT里面的EVENT,其他都是SWING
      

  2.   

    有多个线程在对同一窗体上的组件(外观显示)进行控制?这样设计是否欠妥?
    若没有,多线程应该不会对界面造成负面影响.
    你这种情况一般是其中混有awt组件把swing组件挡住了.
      

  3.   

    是不是不同的线程中还要经常更新画面啊?
    可能是某次你打开菜单的过程中,画面被更新了。just try:)
    可以在更新时,判断菜单的情况,如果打开,让它收回去。
      

  4.   

    现在的情况是这样的,
    右边是一个JTREE,里面有什么小型机,硬盘等等4个NODE的,右面是对应的4个JTABLE在同一个FRAME里面,4个监控线程同时在RUN,并且一直在更新JTABLE,这时点击一个TREENODE,对应的JTABLE会VISIBLE,而其他都INVISIBLE,这些其实都跟菜单无关啊!!!现在是菜单有问题!
      

  5.   

    菜单是静态的,用的是JMENU,只有启动和停止两项,菜单并没有被更新。
      

  6.   

    先谢谢大家了,可能是我没有讲清楚,我再仔细的讲一遍《日志 运行 (JMENU)                                 》
    《JTOOLBAR                                           》
    -------------——————————————————————
    | JTree     |       JPane(include 4 JTable)         |
    | 硬盘      |         只有一个TABLE可见               |
    | 交换机    |                                        |
    | 小型机    |                                        |   ---------> Splitpane
    | 内存      |                                        |
    |           |                                        |
    |           |                                        |
    —————————————————————————————
    右边是一个JTREE,里面有什么小型机,硬盘等等4个NODE的,右面是对应的4个JTABLE在同一个JPANE里面,4个监控线程同时在RUN,并且一直在更新JTABLE 的 TABLE MODEL,这时点击一个TREENODE,对应的JTABLE会VISIBLE(这里仅仅调用了JTABLE的setVisible()函数,没有其他的更新命令),而其他都INVISIBLE,这些其实都跟菜单无关啊!!!现在是菜单有问题!现在的问题是,点击日志菜单,看不见有下拉菜单弹出(实际已弹出),因为我点击日志以后再点击JTREE那杂位置(这个位置的菜单项应该是“导出”),导出会被执行。再次感谢。
      

  7.   

    Hodex,请问REPAINT()应该在什么时候调用,调用谁的?
      

  8.   

    cooled,我确认了一下全都是SWING的组件,没有用AWT的
      

  9.   

    cooled,我确认了一下全都是SWING的组件,没有用AWT的Hodex,请问REPAINT()应该在什么时候调用,调用谁的?geyf,关于你的建议我想了一下,因为始终有一个TABLE是可见的,而这个TABLE的数据是被对应的线程的更新的,每更新一次会使得整个主窗体(包括JMENUBAR 和 JTOOBAR)都更新吗?如果会更新,是很有可能出现你说的那种情况哦,但是我有什么方法避免呢?
    但是现在JMENUBAR 和JTOOLBAR都是在JFRAME里面,可以也不会出现你说的情况。
      

  10.   

    可能切换的逻辑有问题,你是不是直接在菜单ActionPerformed里就切换了JTable?
    如果是的话,建议使用SwingUtilities.invokeLater()来执行.
      

  11.   

    菜单不会切换JTABLE,是点击TREENODE才会切换。
    谢谢
      

  12.   

    刚才试验了一把,随便搞了个table,不断的更新model(就写了个死循环),
    就会出现你的这个现象。估计是画面的更新跟不上,导致出问题建议:
    画面进行更新时,出模态的提示框(确保这时没有其他操作),
    提示正在更新数据,更新结束后关闭这个框。
      

  13.   

    那你就说清楚好了...其实windows有这个普遍的现象啊,系统忙的时候经常会出现类似的画面更新慢的问题
      

  14.   

    如果你的是JFrame
    这样应该可以:frame--你的应用程序框架
    frame.setVisible(true);
      

  15.   

    geyf,应该不是系统忙的原因,运行的时候CPU占用率并不高
      

  16.   

    我也觉得是JFrame中的JPanel更新时挡住了菜单.
    JJTOOLBAR和菜单哪一个在前面?
    JFrame中树和报表用的是JSplitPane吗?
    局部刷新也可以用repaint(x,y,width,height);
      

  17.   

    我也曾经为类似的问题打扰过。 Swing 种只有几种方法是线程安全的,其他都是不能用的,把所有修改界面的操作放到主线程里去,或者调用EventQueue类方法。
    如:
    EventQueue.invokeLater( new Runnable (){ 
          public void run() {
              label.setVisible(false); //Your code here.
          }
        });
         
      

  18.   

    不知道你的具体情况,先谈谈我个人的Swing经验: 
    1.在需要界面刷新数据的地方,尽量开新线程来做
    2.有使用Model的组件,尽量更新Model数据后,使用组件的repaint()来刷新,因为在多个调用repaint后,jvm会合并repaint()操作,比较节省资源
    3.有组件大小或者位置变动的使用valide,invalide,来通知容器和子组件调整自身位置.
    其实上面这些经验说白了就是不要试图获取控制UI的主动权,而是使用一些方式通知UI有了改变,然后UI重绘再回调用户方法重画,这样就不会出问题了.
      

  19.   

    repaint()总是线程安全的,你可以在任何情况下调用。
      

  20.   

    真的很谢谢大家,问题解决了,原因是因为JBUILDER自带的IPWORKS包引起的,现在换成了APACHE里的包所代替,就没有问题了,再次谢谢大家。