我有一個包含 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
提交
取消