为了账号安全,请及时绑定邮箱和手机立即绑定

使用箭头键在弹出菜单中导航时抛出 ClassCastException

使用箭头键在弹出菜单中导航时抛出 ClassCastException

九州编程 2023-04-13 15:24:35
我有一个包含 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)


查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信