我在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及其代表的方法?或者您可以提出另一种解决方法吗?
答案 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)
。