菜单是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:然而博客里面无法提供图标附件,所以各位客官您只能自己动手截图了。图标路径如下:

Swing-JMenu菜单用法-入门的更多相关文章

  1. Swing-JPopupMenu弹出菜单用法-入门

    弹出菜单是GUI程序中非常常见的一种控件.它通常由鼠标右击事件触发,比如在windows系统桌面上右击时,会弹出一个包含“刷新”.“属性”等菜单的弹出菜单.Swing中的弹出菜单是JPopupMenu ...

  2. Java开发笔记(一百三十三)Swing的菜单

    传统的桌面程序基本是对某种类型的文件进行加工,例如Window自带的记事本用来读写文本文件,自带的画图程序用来查看和修改位图文件.为了方便用户切换各种操作,这些程序在窗口顶端放了一排菜单栏,单击菜单栏 ...

  3. 精通awk系列(4):awk用法入门

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk用法入门 awk 'awk_program' a.txt awk示例: # 输出a.txt中的每一行 awk '{print $0 ...

  4. [转帖]PG语法解剖--基本sql语句用法入门

    PG语法解剖--基本sql语句用法入门 https://www.toutiao.com/i6710897833953722894/ COPY 命令挺好的 需要学习一下. 原创 波波说运维 2019-0 ...

  5. Go之Logrus用法入门

    Go之Logrus用法入门 Logrus是Go (golang)的结构化日志程序,完全兼容标准库的API日志程序. Logrus is a structured logger for Go (gola ...

  6. Swing-JComboBox用法-入门

    JComboBox是Swing中的下拉菜单控件.它永远只能选中一个项目,然而比单选按钮节省空间.如果使用setEditable设置为true则内部选项的文本可以编辑,因此这种组件被称为组合框.注意,对 ...

  7. Java-Preferences用法-入门

    Properties提供的应用程序解决方案主要存在两个问题: (1)配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念: (2)没有标准的文件命名规则,存在文件名冲突的可能性. J ...

  8. Java-Properties用法-入门

    对于应用程序的配置,通常的做法是将其保存在独立的配置文件中,程序启动时加载,修改时保存.Java中Properties类就提供了这样一种机制,配置项以Key-Value的数据结构存储在文本文件中,扩展 ...

  9. learning java swing 基本组件用法

    import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event ...

随机推荐

  1. 编写一个简单的TCP服务端和客户端

    下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...

  2. Luogu P1451 求细胞数量

    题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入输出格式 输 ...

  3. [vijos NOIP模拟题]天神下凡 贪心+搜索

    样例: 考试的时候没时间打了,随便敲了敲就交上去了,没想到竟然编译错误,忘定义n了23333 自己测了测能骗20分hhhh 考虑每个圆对答案的贡献,当一个圆被小圆内切的时候,分成了两半,对答案的贡献就 ...

  4. 【转载】QT MySQL数据库操作总结

    转载自http://blog.chinaunix.net/uid-28194872-id-3631462.html #include <QtSql> QT += sqlQSqlDataba ...

  5. linux—find指令常见用法示例

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强da的功能,所以它的选项也很多,其中大部分选项都值得我们花 ...

  6. How to generate file name according to datetime in bat command

    On the command line, note: must copy and paste below lines of code and then execute them one by one: ...

  7. C#高级编程:泛型优点和特性

    泛型是CLR 2.0的一个新特性,在CLR 1.0中,要创建一个灵活的类或方法,但该类或方法在编译期间不知道使用什么类,就得以Object类为基础.而Object在编译期间没有类型安全性,因此必须进行 ...

  8. 简单table分页

    html <table id="pagingTable"> <thead> <tr> <td> 第一列 </td> &l ...

  9. 装饰模式(decorator)

    意图: 动态地给一个对象添加一些额外的职责,就增加功能而言,Decorator模式相比生成子类模式更为灵活 动机: 有时我们希望给某个对象而不是整个类添加一些功能.例如,一个图形用户界面工具箱允许你对 ...

  10. [日推荐] 『Streeter』极乐商店邀你一起来尬舞啊!-store.dreawer.com

    你听的舞蹈有哪些?Jazz?Poppin?Hiphop?现代舞?民族舞?... 今天推荐一款小程序『Streeter』,几乎包含所有舞蹈视频,偷偷学好了,邀请你来尬舞啊 Streeter 这个Logo ...