在应用系统开发中,菜单组件是经常使用的组件,菜单组件包括下拉式菜单和弹出式菜单。下拉式菜单包含若干个菜单项,每个菜单项在用户单击时引发一个动作,菜单可以看做一组层次化管理的命令集合。弹出式菜单也称为快捷菜单,它是相当于某个指定组件的,当该组件受到鼠标单击时,会弹出一个菜单,这个菜单就是弹出式菜单。弹出式菜单的结构比较简单,最多只有二级菜单。
12.3.1 JMenu
在Java中实现下拉式菜单,可以使用JMenu菜单组件。JMenuBar组件是用来摆放JMenu的菜单栏组件,当创建很多JMenu组件后,需要通过JMenuBar组件将JMenu组件加入到窗体中。接下来先了解一下JMenu类的常用方法,如表12.14所示。
- JMenu类的常用方法
常用方法 |
功能描述 |
public JMenu() |
构造没有文本的新 JMenu |
public JMenu(String s) |
构造一个新 JMenu,用提供的字符串作为其文本 |
public JMenu(String s, boolean b) |
构造一个新 JMenu,用提供的字符串作为其文本并指定其是否为分离式 (tear-off) 菜单 |
JMenuItem add(JMenuItem item) |
将某个菜单项追加到此菜单的末尾。 |
void addSeparator() |
将新分隔符追加到菜单的末尾。 |
void remove(int pos) |
从此菜单移除指定索引处的菜单项。 |
void remove(JMenuItem item) |
从此菜单移除指定的菜单项。 |
void removeAll() |
从此菜单移除所有菜单项。 |
insert(JMenuItem mi,int pos) |
在给定位置插入指定的 JMenuitem |
setSelected(boolean b) |
设置菜单的选择状态 |
表12.14中列举了JMenu类的常用方法,接下来通过一个案例来演示下拉式菜单的使用,如例12-13所示。
例12-13 Demo1213.java
1import java.awt.*;
2import javax.swing.*;
3import java.awt.event.ActionEvent;
4import java.awt.event.KeyEvent;
5
6public class Demo1213 {
7 public static void main(String[] args) {
8 final JFrame jFrame = new JFrame("JFrame窗口");
9 JMenuBar jMenuBar = new JMenuBar(); // 创建菜单栏
10 jFrame.setJMenuBar(jMenuBar);
11 // 创建菜单
12 JMenu jMenu = new JMenu("文件(F)");
13 jMenuBar.add(jMenu);
14 jMenu.setMnemonic(KeyEvent.VK_F); //设置快速访问符
15 JMenuItem item=new JMenuItem("新建(N)",KeyEvent.VK_N);
16 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
17 jMenu.add(item);
18 item=new JMenuItem("打开(O)",KeyEvent.VK_O);
19 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
20 jMenu.add(item);
21 item=new JMenuItem("保存(S)",KeyEvent.VK_S);
22 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
23 jMenu.add(item);
24 jMenu.addSeparator();
25 item=new JMenuItem("退出(E)",KeyEvent.VK_E);
26 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK));
27 jMenu.add(item);
28
29 jMenu.addSeparator(); // 添加分隔符
30 jFrame.setLayout(new FlowLayout()); // 设置布局
31 jFrame.setSize(300, 150);
32 // 设置窗体关闭方式
33 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
34 jFrame.setVisible(true);
35
36 }
37}
程序的运行结果如图12.15所示。
- 例12-13运行结果
图12.15中,运行程序先创建了JFrame窗体,然后创建菜单栏、菜单、菜单项,调用setJMenuBar(JMenuBar menuBar)方法将菜单栏添加进窗体,在“退出”菜单项中添加事件监听,点击“退出”窗体立即关闭。
提示:快速访问符是一种快捷键,通常在按下 Alt 键和某个字母时激活。例如,常用的 Alt+F 是“文件” 菜单的快速访问符。
12.3.1 JPopMenu
弹出式菜单,如果要在Java中实现此菜单,可以使用JPopupMenu菜单组件,先来了解一下它的常用方法,如表12.15所示。
- JPopupMenu类的常用方法
构造方法 |
功能描述 |
public JPopupMenu() |
构造一个不带“调用者”的 JPopupMenu。 |
public JPopupMenu(String label) |
构造一个具有指定标题的 JPopupMenu。 |
public JMenuItem add(JMenuItem item) |
将菜单项添加到弹出式菜单的末尾,设置弹出式菜单的可见性 |
表12.15中列出了JPopupMenu类的构造方法,它的常用方法和JMenu类似,这里就不再赘述,读者可以参考JDK的使用文档,接下来通过一个案例来演示弹出式菜单的使用,如例12-14所示。
例12-14 Demo1214.java
1import java.awt.*;
2import java.awt.event.*;
3import javax.swing.*;
4public class TestJPopupMenu {
5 public static void main(String[] args) {
6 final JFrame jf = new JFrame("JFrame窗口"); // 创建JFrame窗体
7 final JPopupMenu jpm = new JPopupMenu(); // 创建菜单
8 // 创建两个菜单项
9 JMenuItem item1 = new JMenuItem("保存");
10 JMenuItem item2 = new JMenuItem("退出");
11 // 为第二个菜单项添加事件监听
12 item2.addActionListener(new ActionListener() {
13 public void actionPerformed(ActionEvent e) {
14 jf.dispose();
15 }
16 });
17 jpm.add(item1); // 将菜单项添加到菜单
18 jpm.add(item2);
19 // 为JFrame添加鼠标点击事件监听器
20 jf.addMouseListener(new MouseAdapter() {
21 public void mouseClicked(MouseEvent e) {
22 if (e.getButton() == e.BUTTON3) {
23 jpm.show(e.getComponent(), e.getX(), e.getY());
24 }
25 }
26 });
27 jf.setLayout(new FlowLayout()); // 设置布局
28 jf.setSize(200, 150);
29 // 设置窗体关闭方式
30 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
31 jf.setVisible(true);
32 }
33}
程序的运行结果如图12.16所示。
- 例12-14运行结果
图12.16中,运行程序弹出JFrame窗口,在窗口中点击右键,会弹出菜单栏,点击退出,窗口成功关闭。例12-14中,先创建了JFrame窗体,然后创建菜单、菜单项,在“退出”的菜单项中添加事件监听,点击“退出”窗体就会关闭,最后为JFrame窗体添加鼠标点击事件监听器,实现右键弹出菜单的效果。
12.3.1 JTable
表格也是Swing GUI编程中常用的组件,表格是一个由行、列组成的二维显示区域,Swing的JTable提供了对表格的支持,通过使用JTable创建表格是非常容易的,它的构造方法如表12.16所示。
- JTable类的构造方法
构造方法 |
功能描述 |
public JTable() |
构造一个默认的JTable,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。 |
public JTable(int numRows, int c) |
使用 DefaultTableModel 构造具有 numRows 行和 numColumns 列个空单元格的 JTable。 |
public (Object[][] rowData, Object[] obj) |
构造一个 JTable 来显示二维数组 rowData 中的值,其列名称为 columnNames。 |
public (TableModel dm) |
构造一个 JTable,使用数据模型 dm、默认的列模型和默认的选择模型对其进行初始化。 |
public JTable(TableModel dm, TableColumnModel cm) |
构造一个 JTable,使用数据模型 dm、列模型 cm 和默认的选择模型对其进行初始化。 |
表12.16列举了JTable类的构造方法,它在创建的时候,可以把一个二维数据包装成一个表格,这个二维数据既可以是一个二维数组,也可以是集合元素为Vector的Vector对象,为了给表格每列设置列标题,还需要传入一个一维数据作为列标题,接下来通过一个案例来演示JTable类的使用,如例12-15所示。
例12-15 Demo1215.java
1import javax.swing.*;
2public class Demo1215{
3 public static void main(String[] args) {
4 JFrame jFrame = new JFrame("JFrame窗口"); // 创建JFrame窗体
5 String[] arr = { "序号", "城市", "景点" }; // 定义标题
6 // 定义表格数据
7 Object[][] data = { new Object[] { 1, "焦作市", "红旗渠" },
8 new Object[] { 2, "林州市", "云台山" },
9 new Object[] { 3, "驻马店市", "嵖岈山" } };
10 // 创建JTable
11 JTable table = new JTable(data, arr);
12 jFrame.add(new JScrollPane(table));
13 jFrame.setSize(300, 160);
14 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15 jFrame.setVisible(true);
16 }
17}
程序的运行结果如图12.17所示。
- 例12-15运行结果
图12.17中,程序运行先创建了JFrame窗体,然后定义了表格标题和数据的两个数组,最后创建JTable时将两个数组以参数传入,利用JTable类成功展现了一个表格。