3

正如我在上一个问题中提到的那样,我在 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 后就没有更新。适用于 Windows 和 Mac OS X 的当前 Java 版本运行良好。问题本身:也许有人知道手动同步 JMenu 及其表示的方法?或者,也许您可​​以提出另一种解决方法?

4

2 回答 2

2

我找到了解决方案,而且并不难......

.................................
        menu.add(item2);
        setBounds(100, 100, 100, 100);
        setVisible(true);
        submenu.add(subitem1);
        submenu.add(subitem2);
        SwingUtilities.updateComponentTreeUI(mb); //This line updates menu representation
    }
................................
于 2012-05-31T12:12:28.587 回答
1

也许我理解错了,但显示更改只是一个问题?如果是这样,请在andrepaint()之后尝试。submenu.add(subitem1)submenu.add(subitem2)

于 2012-05-29T13:53:40.313 回答