我有一個(gè)包含 JMenu 和 JMenuItem 的 menuBar。如果我使用箭頭鍵導(dǎo)航,程序會(huì)在您遇到 JMenuItem 時(shí)立即拋出 ClassCastException。有沒(méi)有辦法捕獲此異常或確保在導(dǎo)航時(shí)跳過(guò) 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貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
您應(yīng)該只將JMenu
對(duì)象添加到 a?JMenuBar
,而不是JMenuItem
對(duì)象。
如果你不這樣做,你會(huì)得到:
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
有一個(gè)add(JMenu)
您已經(jīng)在使用的方法。
但是,如果您傳遞 a?JMenuItem
,則不會(huì)調(diào)用此方法,而是繼承add(Component)
自java.awt.Container
,這就是為什么您可以添加任何Component
雖然只有JMenuItem
正確支持。
底層 BasicPopupMenuUI 類(參見(jiàn)第 531 行:BasicPopupMenuUI.java)期望添加到菜單欄的所有組件都是JMenu
對(duì)象,以至于在代碼中進(jìn)行了強(qiáng)制轉(zhuǎn)換,這就是崩潰發(fā)生的地方:
newSelection[2] = ((JMenu)nextMenu).getPopupMenu();
所以只需將您的組件添加為菜單:
menuBar.add(new?JMenu("Button?3"));
也不要用于add
菜單欄,考慮使用setJMenuBar(menuBar)
。
添加回答
舉報(bào)
0/150
提交
取消