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

我有一个包含 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();


  }

}


九州编程
浏览 95回答 1
1回答

临摹微笑

您应该只将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)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java