Swing-JMenu菜單用法-入門


菜單是Swing客戶端程序不可獲取的一個組件。窗體菜單大致由菜單欄、菜單和菜單項三部分組成,如下圖所示:

由圖可見,對於一個窗體,首先要添加一個JMenuBar,然后在其中添加JMenu,在JMenu中添加JMenuItem。JMenuItem是最小單元,它不能再添加Jmenu或JMenuItem。而JMenu是可以再添加JMenu的,比如上圖中的New菜單。可以添加橫線將內部成員分隔開,也就是圖中的Seperator。仔細看,每一個JMenu都有一個字母帶有下划線,該字母就是該菜單的快捷鍵,使用setMnemonic方法設置,菜單項也一樣,設置后的效果是在能看到該項的界面中,按下該鍵則觸發該項;圖中的“Ctrl + W”是該菜單項的加速器,它的作用是,在窗體中按下該鍵值組合后,該項即被觸發,即使它是不可見的,使用setAccelerator設置。需要注意,JMenu無法使用加速器,也就是說使用swing無法直接像圖中那樣添加“Alt + Shift + N”。

下面是菜單的常用方法:

 

為了練手,我們就來實現Eclipse的菜單吧!

下面是代碼

JMenuDemo.java

package Swing;

import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

/*
 * 模仿Eclipse菜單欄結構
 */
public class JMenuDemo extends JFrame {
    String[][] menuNameMnemonics = { { "File", "f" }, { "Edit", "e" },
            { "Source", "s" }, { "Refactor", "t" }, { "Navigate", "n" },
            { "Search", "a" }, { "Project", "p" }, { "Run", "r" }, { "Window", "w" }, { "Help", "h" } };
    JMenuBar menuBar;

    public JMenuDemo() {
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        
        for (String[] menuNameMnemonic : menuNameMnemonics) {
            menuBar.add(createMenu(menuNameMnemonic[0], menuNameMnemonic[1]));
        }
        
        // 為File添加子菜單和菜單項
        JMenu fileMenu = getMenu("File");
        fileMenu.add(createMenuNamedNew());
        
        fileMenu.add(createMenuItem("Open File", null, null,null));
        fileMenu.addSeparator();
        
        fileMenu.add(createMenuItem("Close", "c", null, KeyStroke.getKeyStroke('W', InputEvent.CTRL_MASK)));
        fileMenu.add(createMenuItem("Close All", "l", null, KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Save", "s", new ImageIcon("resources\\JMenuDemo\\icon\\Save.png"), KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)));
        fileMenu.add(createMenuItem("Save As", "a", new ImageIcon("resources\\JMenuDemo\\icon\\SaveAs.png"), null));
        fileMenu.add(createMenuItem("Save All", "e", new ImageIcon("resources\\JMenuDemo\\icon\\SaveAll.png"), KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
        fileMenu.add(createMenuItem("Revert", "t", null, null));
        fileMenu.addSeparator();
        
        JMenuItem menuNamedMove = createMenuItem("Move", "v", null, KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
        menuNamedMove.setEnabled(false);
        fileMenu.add(menuNamedMove);
        
        JMenuItem menuNamedRename = createMenuItem("Rename", "m", new ImageIcon("resources\\JMenuDemo\\icon\\Rename.png"), KeyStroke.getKeyStroke("F2"));
        menuNamedRename.setEnabled(false);
        fileMenu.add(menuNamedRename);
        
        fileMenu.add(createMenuItem("Refresh", "f", new ImageIcon("resources\\JMenuDemo\\icon\\Refresh.png"), KeyStroke.getKeyStroke("F5")));
        
        JMenu menuNamedConvert = createMenuNamedConvert();
        fileMenu.add(menuNamedConvert);//添加New菜單
        
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Print", "p", new ImageIcon("resources\\JMenuDemo\\icon\\Print.png"), KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK)));
        fileMenu.addSeparator();
        
        JMenu menuNamedSwitch = createMenu("Switch WorkSpsace", "w");
        menuNamedSwitch.add(createMenuItem("Other", "o", null, null));
        fileMenu.add(menuNamedSwitch);
        
        fileMenu.add(createMenuItem("Restart", null, null, null));
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Import", "i", new ImageIcon("resources\\JMenuDemo\\icon\\Import.png"), null));
        fileMenu.add(createMenuItem("Export", "o", new ImageIcon("resources\\JMenuDemo\\icon\\Export.png"), null));
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Properties", "r", null, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.ALT_MASK)));
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Exit", "x", null, null));
    }

    private JMenu createMenuNamedNew() {
        /*
         * * 創建名稱為New的menu
         */
        JMenu menu = createMenu("New", "n");        
        menu.add(createMenuItem("JavaProject", null, new ImageIcon("resources\\JMenuDemo\\icon\\JavaProject.gif"), null));
        menu.add(createMenuItem("Project", null, new ImageIcon("resources\\JMenuDemo\\icon\\Project.gif"), null));
        menu.add(createMenuItem("Package", null, new ImageIcon("resources\\JMenuDemo\\icon\\Package.gif"), null));
        menu.add(createMenuItem("Class", null, new ImageIcon("resources\\JMenuDemo\\icon\\Class.gif"), null));
        menu.add(createMenuItem("Interface", null, new ImageIcon("resources\\JMenuDemo\\icon\\Interface.gif"), null));
        menu.add(createMenuItem("Enum", null, new ImageIcon("resources\\JMenuDemo\\icon\\Enum.gif"), null));
        menu.add(createMenuItem("Annotation", null, new ImageIcon("resources\\JMenuDemo\\icon\\Annotation.gif"), null));
        menu.add(createMenuItem("SourceFolder", null, new ImageIcon("resources\\JMenuDemo\\icon\\SourceFolder.gif"), null));
        menu.add(createMenuItem("JavaWorkingSet", null, new ImageIcon("resources\\JMenuDemo\\icon\\JavaWorkingSet.gif"), null));
        menu.add(createMenuItem("Folder", null, new ImageIcon("resources\\JMenuDemo\\icon\\Folder.gif"), null));
        menu.add(createMenuItem("File", null, new ImageIcon("resources\\JMenuDemo\\icon\\File.gif"), null));
        menu.add(createMenuItem("UntitledTextFile", null, new ImageIcon("resources\\JMenuDemo\\icon\\UntitledTextFile.gif"), null));
        menu.add(createMenuItem("JunitTestCase", null, new ImageIcon("resources\\JMenuDemo\\icon\\JunitTestCase.gif"), null));
        menu.add(createMenuItem("Task", null, new ImageIcon("resources\\JMenuDemo\\icon\\Task.gif"), null));
        menu.add(createMenuItem("Example", null, new ImageIcon("resources\\JMenuDemo\\icon\\Example.gif"), null));
        menu.add(createMenuItem("Other", null, new ImageIcon("resources\\JMenuDemo\\icon\\Other.gif"), null));
        return menu;
    }
    
    private JMenu createMenuNamedConvert() {
        /*
         * 創建名稱為Convert的menu
         */
        JMenu menu = createMenu("Convert Line Delimiters to", "v");
        menu.add(createMenuItem("Windows (CRLF, \\r\\n, 0D0A, xx)[default]", "w", null, null));
        menu.add(createMenuItem("Unix (LF, \\n, 0A, xx)", "n", null, null));
        return menu;
    }

    private JMenu getMenu(String menuName) {
        /*
         * 根據名稱從menuBar中查找menu並返回
         */
        JMenu menu = null;
        for (int i = 0; i < menuBar.getMenuCount(); i++) {
            menu = menuBar.getMenu(i);
            if (menu.getText().equals(menuName))
                return menu;
        }
        return null;
    }

    private JMenu createMenu(String name, String mnemonic) {
        /*
         * 根據名稱和快捷鍵創建menu並添加到menuBar
         */
        JMenu menu = new JMenu(name);
        if (mnemonic != null)
            menu.setMnemonic(mnemonic.toCharArray()[0]);
        return menu;
    }

    private JMenuItem createMenuItem(String name, String mnemonic, Icon icon, KeyStroke keyStroke) {
        /*
         * 根據名稱和快捷鍵創建menu並添加到menuBar
         */
        JMenuItem menuItem = new JMenuItem(name, icon);
        if (mnemonic != null)
            menuItem.setMnemonic(mnemonic.toCharArray()[0]);
        if (keyStroke != null)
            menuItem.setAccelerator(keyStroke);
        return menuItem;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 創建窗體
        JMenuDemo frame = new JMenuDemo();
        //指定標題
        frame.setTitle("JMenuDemo");
        //指定icno
        frame.setIconImage(new ImageIcon("resources\\JMenuDemo\\icon\\Eclipse.png").getImage());
        // 關閉窗體后退出程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 自動適配所有控件大小
        frame.setSize(frame.getPreferredSize().width, 200);
        //frame.pack();
        // 設置窗體位置在屏幕中央
        frame.setLocationRelativeTo(null);
        // 顯示窗體
        frame.setVisible(true);
    }
}

 

效果圖0:

效果圖1:

 

效果圖2:

 

效果圖3:

PS:所有圖標都是使用截圖工具截出來的,格式有png和gif兩種。New菜單里面的圖標都是gif格式,可以看到帶有雪花點;而png圖標效果就非常好,推薦使用。

PS2:然而博客里面無法提供圖標附件,所以各位客官您只能自己動手截圖了。圖標路徑如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM