使用箭头键浏览弹出菜单时引发ClassCastException

时间:2019-07-22 11:59:24

标签: java classcastexception

我有一个menuBar,其中包含JMenu和JMenuItem。如果我使用箭头键导航,则一旦遇到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 个答案:

答案 0 :(得分:0)

您应仅将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)具有您已经在使用的JMenuItem方法。

但是,如果您传递的是add(Component),则不会调用此方法,但是将从java.awt.Container继承的Component来代替,这就是您可以添加任何JMenuItem,尽管仅正确支持JMenu

基础BasicPopupMenuUI类(请参见第531行:BasicPopupMenuUI.java)期望添加到菜单栏中的所有组件都是newSelection[2] = ((JMenu)nextMenu).getPopupMenu();对象,以至于强制在代码中进行强制转换,那就是崩溃发生的地方:

menuBar.add(new JMenu("Button 3"));

所以只需将您的组件添加为菜单:

add

也不要将setJMenuBar(menuBar)用于菜单栏,请考虑改为使用{{1}}。