Swing學習18:Java Swing JMenu和JPopupMenu

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

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

JMenu類的常用方法

創建菜單常用構造方法有兩個:JMenu() 和 JMenu(String s)。第一個構造方法創建一個無文本的 JMenu 對象,第二個構造方法創建一個帶有指定文本的 JMenu 對象。JMenu 類的常用方法如表 1 所示。
在這裏插入圖片描述
例 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)”菜單,可以在想讓菜單顯示的任何其他位置使用。例如,當用戶在指定區域中右擊時。

JPopupMenu 類的常用方法如表 2 所示。
在這裏插入圖片描述
例 2
使用 JPopupMenu 類創建一個彈出式菜單,並在菜單中使用子菜單。主要實現代碼如下:

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 所示。
在這裏插入圖片描述

謝謝觀看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章