18、Java Swing JMenu和JPopupMenu:菜单和弹出式菜单
菜單由 Swing 中的 JMenu 類實現,可以包含多個菜單項和帶分隔符的菜單。
在菜單中,菜單項由 JMenuItem 類表示,分隔符由 JSeparator 類表示。
菜單本質上是帶有關聯 JPopupMenu 的按鈕。當按下“按鈕”時,就會顯示 JPopupMenu。
如果“按鈕”位于 JMenuBar 上,則該菜單為頂層窗口。
如果“按鈕”是另一個菜單項,則 JPopupMenu 就是“下拉”菜單。
JMenu 類的常用方法
創建菜單常用構造方法有兩個:JMenu() 和 JMenu(String s)。
第一個構造方法創建一個無文本的 JMenu 對象,
第二個構造方法創建一個帶有指定文本的 JMenu 對象。JMenu 類的常用方法如表 1 所示。
JMenu類的常用方法:
- add(Action a)---- 創建連接到指定 Action 對象的新菜單項,并將其追加到此菜單的末尾
- add(Component c)---- 將某個組件追加到此菜單的末尾
- add(Component c,int index) ----將指定組件添加到此容器的給定位置
- add(JMenuItem menultem)---- 將某個菜單項追加到此菜單的末尾
- add(String s) ----創建具有指定文本的新菜單項,并將其追加到此菜單的末尾
- addSeparator()---- 將新分隔符追加到菜單的末尾
- doCliclc(int pressTime) ----以編程方式執行“單擊”操作
- getDelay() ----返回子菜單向上或向下彈出前建議的延遲(以毫秒為單位)
- getltem(int pos) ----返回指定位置的 JMenuItem
- getItemCount()---- 返回菜單上的項數,包括分隔符
- getMenuComponent(int n)---- 返回位于位置 n 的組件
- getMenuComponents()---- 返回菜單子組件的 Component 數組
- getSubElements()---- 返回由 MenuElement 組成的數組,其中包含此菜單組件的子菜單
- insert(JMenuItem mi,int pos) ----在給定位置插入指定的 JMenuitem
- insert(String s,pos)---- 在給定位置插入具有指定文本的新菜單項
- insertSeparator(int index) ----在指定的位置插入分隔符
- isMenuComponent(Component c) ----如果在子菜單層次結構中存在指定的組件,則返回 true
- isPopupMenuVisible()---- 如果菜單的彈出窗口可見,則返回 rue
- isSelected() 如果菜單是當前選擇的----(即高亮顯示的)菜單,則返回 true
- isTopLevelMenu()---- 如果菜單是“頂層菜單”(即菜單欄的直接子級),則返回 true
- setDelay(int d)---- 設置菜單的 PopupMenu 向上或向下彈出前建議的延遲
- setMenuLocation(int x,int y) ----設置彈出組件的位置
- setPopupMenuVisible(boolean b)---- 設置菜單彈出的可見性
- setSelected(boolean b)---- 設置菜單的選擇狀態
例 1
菜單如果依附到 JMenuBar 對象上,則此菜單就是菜單欄中的菜單。
菜單如果依附在 JPopupMenu 對象上,此菜單就是彈出式菜單。
實現菜單欄和彈出式菜單的原理是一樣的,但在具體的實現方式上有一些區別。
下面編寫一個案例,使用 JMenuBar 類創建一個包含“文件”菜單和“編輯”菜單的菜單窗口。主要實現代碼如下:
import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.KeyStroke; public class JMenuDemo1 extends JMenuBar {public JMenuDemo1(){add(createFileMenu()); //添加“文件”菜單add(createEditMenu()); //添加“編輯”菜單setVisible(true);}public static void main(String[] agrs){JFrame frame=new JFrame("菜單欄");frame.setSize(300,200);frame.setJMenuBar(new JMenuDemo1());frame.setVisible(true);}//定義“文件”菜單private JMenu createFileMenu(){JMenu menu=new JMenu("文件(F)");menu.setMnemonic(KeyEvent.VK_F); //設置快速訪問符JMenuItem item=new JMenuItem("新建(N)",KeyEvent.VK_N);item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));menu.add(item);item=new JMenuItem("打開(O)",KeyEvent.VK_O);item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));menu.add(item);item=new JMenuItem("保存(S)",KeyEvent.VK_S);item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));menu.add(item);menu.addSeparator();item=new JMenuItem("退出(E)",KeyEvent.VK_E);item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK));menu.add(item);return menu;}//定義“編輯”菜單private JMenu createEditMenu(){JMenu menu=new JMenu("編輯(E)");menu.setMnemonic(KeyEvent.VK_E);JMenuItem item=new JMenuItem("撤銷(U)",KeyEvent.VK_U);item.setEnabled(false);menu.add(item);menu.addSeparator();item=new JMenuItem("剪貼(T)",KeyEvent.VK_T);menu.add(item);item=new JMenuItem("復制(C)",KeyEvent.VK_C);menu.add(item);menu.addSeparator();JCheckBoxMenuItem cbMenuItem=new JCheckBoxMenuItem("自動換行");menu.add(cbMenuItem);return menu;} }上述代碼調用 JMenu 對象的 setMnemonic() 方法設置當前菜單的快速訪問符。
該符號必須對應鍵盤上的一個鍵,并且應該使用 java.awt.event.KeyEvent 中定義的 VK—XXX 鍵代碼之一指定。
提示:快速訪問符是一種快捷鍵,通常在按下 Alt 鍵和某個字母時激活。例如,常用的 Alt+F 是“文件” 菜單的快速訪問符。
JMenuItem 類實現的是菜單中的菜單項。菜單項本質上是位于列表中的按鈕。當用戶單擊“按鈕”時,則執行與菜單項關聯的操作。
JMenuItem 的常用構造方法:
- JMenuItem(String text):創建帶有指定文本的 JMenuItem。
- JMenuItem(String text,Icon icon):創建帶有指定文本和圖標的 JMenuItem。
- JMenuItem(String text,int mnemonic):創建帶有指定文本和鍵盤助記符的 JMenuItem。
在該實例中,創建菜單項后調用 JMenuItem 對象的 setAccelerator(KeyStroke) 方法來設置修改鍵,它能直接調用菜單項的操作監聽器而不必顯示菜單的層次結構。在本實例中沒有實現事件監聽機制,所以使用快捷鍵時將得不到程序的任何響應,但是在菜單項中將出現快捷鍵。
運行該實例,圖 1 所示是“文件”菜單展開效果,圖 2 所示是“編輯”菜單展開的效果。
彈出式菜單 JPopuMenu
彈出式菜單由 JPopupMenu 類實現,它是一個可彈出并顯示一系列選項的小窗口。
它還用于當用戶選擇菜單項并激活它時顯示的“右拉式(pull-right)”菜單,可以在想讓菜單顯示的任何其他位置使用。例如,當用戶在指定區域中右擊時。
JPopMenu類的常用方法:
- getInvoker()---- 返回作為此彈出菜單的“調用者”的組件
- setInvoker(Component invoker)---- 設置彈出菜單的調用者,即彈出菜單在其中顯示的組件
- addPopupMenuListener(PopupMenuListener1)---- 添加 PopupMenu 監聽器
- removePopupMenuListener(PopupMenuListener1)---- 移除 PopupMenu 監聽器
- getPopupMenuListeners()---- 返回利用 addPopupMenuListener()添加到此 JMenuitem 的所有PopupMenuListener 組成的數組
- getLabel() ----返回彈出菜單的標簽
- setLabel(String label) ----設置彈出菜單的標簽
- show(Component invoker,int x,int y)---- 在調用者的坐標空間中的位置 X、Y 處顯示彈出菜單
- getComponentIndex(Component c) ----返回指定組件的索引
例 2
使用 JPopupMenu 類創建一個彈出式菜單,并在菜單中使用子菜單。主要實現代碼如下:
在使用彈出菜單時一定要注意層次關系和菜單的位置。程序運行后由于菜單沒有被激活所以窗口是空白的,如圖 1 所示。單擊鼠標右鍵即可查看彈出式菜單,如圖 2 所示。
總結
以上是生活随笔為你收集整理的18、Java Swing JMenu和JPopupMenu:菜单和弹出式菜单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17、Java Swing Timer:
- 下一篇: 19、Java Swing JToolB