我有一个包含 JMenu 和 JMenuItem 的 menuBar。如果我使用箭头键导航,程序会在您遇到 JMenuItem 时立即抛出 ClassCastException。有没有办法捕获此异常或确保在导航时跳过 JMenuItem?import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;public class GUI extends JFrame { public GUI() { JMenuBar menuBar = new JMenuBar(); JMenu firstButtonMenu = new JMenu("Button 1"); firstButtonMenu.add(new JMenuItem("Sub 1")); firstButtonMenu.add(new JMenuItem("Sub 2")); JMenu secondButtonMenu = new JMenu("Button 2"); secondButtonMenu.add(new JMenuItem("Sub 1")); secondButtonMenu.add(new JMenuItem("Sub 2")); menuBar.add(firstButtonMenu); menuBar.add(secondButtonMenu); menuBar.add(new JMenuItem("Button 3")); add(menuBar); setVisible(true); pack(); }}
1 回答
临摹微笑
TA贡献1982条经验 获得超2个赞
您应该只将JMenu
对象添加到 a JMenuBar
,而不是JMenuItem
对象。
如果你不这样做,你会得到:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JMenuItem cannot be cast to javax.swing.JMenu at javax.swing.plaf.basic.BasicPopupMenuUI$Actions.selectParentChild(BasicPopupMenuUI.java:531) at javax.swing.plaf.basic.BasicPopupMenuUI$Actions.actionPerformed(BasicPopupMenuUI.java:426)
JMenuBar
有一个add(JMenu)
您已经在使用的方法。
但是,如果您传递 a JMenuItem
,则不会调用此方法,而是继承add(Component)
自java.awt.Container
,这就是为什么您可以添加任何Component
虽然只有JMenuItem
正确支持。
底层 BasicPopupMenuUI 类(参见第 531 行:BasicPopupMenuUI.java)期望添加到菜单栏的所有组件都是JMenu
对象,以至于在代码中进行了强制转换,这就是崩溃发生的地方:
newSelection[2] = ((JMenu)nextMenu).getPopupMenu();
所以只需将您的组件添加为菜单:
menuBar.add(new JMenu("Button 3"));
也不要用于add
菜单栏,考虑使用setJMenuBar(menuBar)
。
添加回答
举报
0/150
提交
取消