Apple的JAVA:JMenu的子菜单没有更新

时间:2012-05-29 13:24:45

标签: java macos jmenu

我在Apple的JVM中遇到了一些错误,正如我在上一个问题中所提到的那样。我可以忍受第一个错误。但第二个真的很烦人。如果我创建一个带有子菜单的JMenu,我必须在运行时修改子菜单内容,我就是不能这样做。调试显示项目已添加到Jmenu(子菜单)。但屏幕菜单中没有任何事情发生。这看起来像是真正的JMenu对象的同步问题,以及它在Mac OS X菜单栏中的表示。

以下是示例代码:

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;


public class TestMenu extends JFrame{

    public TestMenu() {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JMenuBar mb = new JMenuBar();
        mb.setName("menubar");
        JMenu menu = new JMenu("menu"); 
        JMenu submenu = new JMenu("submenu");
        JMenuItem item = new JMenuItem("test item");
        JMenuItem item2 = new JMenuItem("test item2");
        JMenuItem subitem1 = new JMenuItem("sub item1");
        JMenuItem subitem2 = new JMenuItem("sub item2");
        menu.add(item);
        mb.add(menu);
        menu.add(submenu);
        setJMenuBar(mb);
        menu.add(item2);
        setBounds(100, 100, 100, 100);
        setVisible(true);
        submenu.add(subitem1);
        submenu.add(subitem2);
    }

    public static void main(String[] args) {

        new TestMenu();

    }

}

注意:我说的是Apple的JVM版本1.6.0_15。我必须记住过时的版本,以确保我的软件不会暴露任何数据,因为用户计算机上的某些JVM中的错误因为他或她购买了MAC而没有更新。当前版本的Java for Windows和Mac OS X工作正常。 问题本身:也许有人知道手动同步JMenu及其代表的方法?或者您可以提出另一种解决方法吗?

2 个答案:

答案 0 :(得分:3)

我找到了解决方案,并没有那么难......

.................................
        menu.add(item2);
        setBounds(100, 100, 100, 100);
        setVisible(true);
        submenu.add(subitem1);
        submenu.add(subitem2);
        SwingUtilities.updateComponentTreeUI(mb); //This line updates menu representation
    }
................................

答案 1 :(得分:1)

也许我理解你错了,但显示这些变化只是一个问题?如果是,请在repaint()submenu.add(subitem1)后尝试submenu.add(subitem2)