我有一个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();
}
}
答案 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}}。