C語言中文網 目錄
首頁 > Java Swing 閱讀:1,865

Java Swing JMenu和JPopupMenu:菜單和彈出式菜單

< 上一頁Swing計時器 Swing工具欄下一頁 >

菜單由 Swing 中的 JMenu 類實現,可以包含多個菜單項和帶分隔符的菜單。在菜單中,菜單項由 JMenuItem 類表示,分隔符由 JSeparator 類表示。

菜單本質上是帶有關聯 JPopupMenu 的按鈕。當按下“按鈕”時,就會顯示 JPopupMenu。如果“按鈕”位于 JMenuBar 上,則該菜單為頂層窗口。如果“按鈕”是另一個菜單項,則 JPopupMenu 就是“下拉”菜單。

JMenu 類的常用方法

創建菜單常用構造方法有兩個:JMenu() 和 JMenu(String s)。第一個構造方法創建一個無文本的 JMenu 對象,第二個構造方法創建一個帶有指定文本的 JMenu 對象。JMenu 類的常用方法如表 1 所示。

表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 類創建一個包含“文件”菜單和“編輯”菜單的菜單窗口。主要實現代碼如下:
package ch18;
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 的常用構造方法有以下三個。
  1. JMenuItem(String text):創建帶有指定文本的 JMenuItem。
  2. JMenuItem(String text,Icon icon):創建帶有指定文本和圖標的 JMenuItem。
  3. JMenuItem(String text,int mnemonic):創建帶有指定文本和鍵盤助記符的 JMenuItem。

在該實例中,創建菜單項后調用 JMenuItem 對象的 setAccelerator(KeyStroke) 方法來設置修改鍵,它能直接調用菜單項的操作監聽器而不必顯示菜單的層次結構。在本實例中沒有實現事件監聽機制,所以使用快捷鍵時將得不到程序的任何響應,但是在菜單項中將出現快捷鍵。

運行該實例,圖 1 所示是“文件”菜單展開效果,圖 2 所示是“編輯”菜單展開的效果。

“文件”菜單
圖1 “文件”菜單

“編輯”菜單
圖2 “編輯”菜單

彈出式菜單 JPopuMenu

彈出式菜單由 JPopupMenu 類實現,它是一個可彈出并顯示一系列選項的小窗口。它還用于當用戶選擇菜單項并激活它時顯示的“右拉式(pull-right)”菜單,可以在想讓菜單顯示的任何其他位置使用。例如,當用戶在指定區域中右擊時。

JPopupMenu 類的常用方法如表 2 所示。

表2 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 類創建一個彈出式菜單,并在菜單中使用子菜單。主要實現代碼如下:
package ch18;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
public class JPopupMenuDemo extends JFrame
{
    JMenu fileMenu;
    JPopupMenu jPopupMenuOne;
    JMenuItem openFile,closeFile,exit;
    JRadioButtonMenuItem copyFile,pasteFile;
    ButtonGroup buttonGroupOne;
    public JPopupMenuDemo()
    {
        jPopupMenuOne=new JPopupMenu();    //創建jPopupMenuOne對象
        buttonGroupOne=new ButtonGroup();
        //創建文件菜單及子菜單,并將子菜單添加到文件菜單中
        fileMenu=new JMenu("文件");
        openFile=new JMenuItem("打開");
        closeFile=new JMenuItem("關閉");
        fileMenu.add(openFile);
        fileMenu.add(closeFile);
        //將fileMenu菜單添加到彈出式菜單中
        jPopupMenuOne.add(fileMenu);
        //添加分割符
        jPopupMenuOne.addSeparator();
        //創建單選菜單項,并添加到ButtonGroup對象中
        copyFile=new JRadioButtonMenuItem("復制");
        pasteFile=new JRadioButtonMenuItem("粘貼");
        buttonGroupOne.add(copyFile);
        buttonGroupOne.add(pasteFile);
        //將copyFile添加到jPopupMenuOne中
        jPopupMenuOne.add(copyFile);
        //將pasteFile添加到jPopupMenuOne中
        jPopupMenuOne.add(pasteFile);
        jPopupMenuOne.addSeparator();
        exit=new JMenuItem("退出");
        //將exit添加到jPopupMenuOne中
        jPopupMenuOne.add(exit);
        //創建監聽器對象
        MouseListener popupListener=new PopupListener(jPopupMenuOne);
        //向主窗口注冊監聽器
        this.addMouseListener(popupListener);
        this.setTitle("彈出式菜單");
        this.setBounds(100,100,250,150);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String args[])
    {
        new JPopupMenuDemo();
    }
    //添加內部類,其擴展了MouseAdapter類,用來處理鼠標事件
    class PopupListener extends MouseAdapter
    {
        JPopupMenu popupMenu;
        PopupListener(JPopupMenu popupMenu)
        {
            this.popupMenu=popupMenu;
        }
        public void mousePressed(MouseEvent e)
        {
            showPopupMenu(e);
        }
        public void mouseReleased(MouseEvent e)
        {
            showPopupMenu(e);
        }
        private void showPopupMenu(MouseEvent e)
        {
            if(e.isPopupTrigger())
            {
                //如果當前事件與鼠標事件相關,則彈出菜單
                popupMenu.show(e.getComponent(),e.getX(),e.getY());
            }
        }
    }
}

在使用彈出菜單時一定要注意層次關系和菜單的位置。程序運行后由于菜單沒有被激活所以窗口是空白的,如圖 1 所示。單擊鼠標右鍵即可查看彈出式菜單,如圖 2 所示。


彈出式菜單
圖2 彈出式菜單
< 上一頁Swing計時器 Swing工具欄下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo