第7章 程序设计案例分析
7.2 设计窗体
7.3.1 设计菜单
在 Java 程序中编写菜单程序是一件比较麻烦的事,需要写不少代码。通常需要手工创 建菜单项对象(JMenuItem 的实例)、菜单对象(JMenu 的实例)、菜单栏对象(JMenuBar 的实例)。然后把菜单项对象添加到菜单对象中;把菜单对象添加到菜单栏对象中。最后为 那个能使用菜单的容器组件添加完整的主菜单栏。凡是JFrame、JDialog、JApplet 及其派生 类都有一个 setJMenuBar 方法用于设置菜单栏。每个菜单项 JMenuItem 都有一个相关联的 ActionListener 用于监听和处理菜单点击事件。
使用NetBeans IDE 在窗体编辑器中可视化设计菜单,使得编写菜单程序颇为简单。具 体步骤如下:
首先在窗体编辑器中创建菜单栏
• 在“组件面板”窗口中,单击JMenuBa 或 MenuBa 组件。
• 在要添加菜单栏的JFrame、JDialog 或 JApplet 容器中单击任意位置。
如果这是添加到窗体中的第一个菜单栏,则该菜单栏在窗体上可见。如果这不是窗体的 第一个菜单栏,则菜单出现在“检查器”窗口中的“其他组件”节点下面,并且在窗体中不 显示该菜单栏。本案例程序中,我们用以上方法为主窗体MainForm 创建了一个菜单栏,命 名为menuBar,如图 7-10 所示。
然后将菜单添加到菜单栏中
• 在“检查器”窗口中右键单击该菜单栏,然后从上下文菜单中选择“添加JMenu”。
• 如果要命名新的菜单,请在“检查器”窗口中展开菜单栏节点,右键单击新创建的 菜单节点并选择“属性”。然后,为文本属性输入所需的名称。
本案例程序中,我们用以上方法为主窗体菜单栏创建了 2 个 JMenu 菜单,命名为 menuFile 和 menuView,如图 7-10 所示。
接着是添加菜单项
• 在“检查器”窗口中,右键单击要添加项目的菜单。
• 从上下文菜单中选择“添加”,然后从子菜单中选择一个项目。
如果要重命名新的菜单项,请在“检查器”窗口中展开菜单节点,右键单击新创建的菜 单项并选择“属性”。然后,为文本属性输入所需的名称。
本案例程序中,我们用以上方法为menuFile 菜单创建了 2 个 JMenuItem 菜单项,命名 为menuItemOpen 和 menuItemExit;为 menuView 菜单创建了 1 个 JMenuItem 菜单项,命名 为menuItemSetup,如图 7-10 所示。
图 7-10 为主界面设计菜单 最后为菜单项添加事件
• 在“检查器”窗口中选择菜单项。然后在“属性”窗口中单击“事件”按钮,并选 择所需的事件属性。
• 在“检查器”窗口或窗体编辑器中右键单击菜单项,然后从节点的上下文菜单中的
“事件”菜单中进行选择。
以本案例程序中的“退出”菜单项 menuItemExit 为例,我们在“检查器”窗口中选择 菜单项 menuItemExit。然后在“属性”窗口中单击“事件”按钮,为源组件 menuItemExit 选择事件actionPerformed,回车后系统自动生成的菜单事件处理代码如下:
private void initComponents() { ... ...
menuItemExit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuItemExitActionPerformed(evt);
} ... ...
});
}
private void menuItemExitActionPerformed(java.awt.event.ActionEvent evt) { exit();//用户添加的代码
}
然后,我们就可以在事件处理程序中添加自己的代码。 1: package wordwinner;
2: import java.io.*;
3: import java.awt.*;
4: import javax.swing.*;
5: import java.util.*;
6:
7: public class MainForm extends javax.swing.JFrame { 8:
35: menuFile = new javax.swing.JMenu();
44: addWindowListener(new java.awt.event.WindowAdapter() {
45: public void windowClosing(java.awt.event.WindowEvent evt) {
51: menuItemOpen.setText("\u6253\u5f00");
52: menuItemOpen.addActionListener(new
61: menuItemExit.setText("\u9000\u51fa");
62: menuItemExit.addActionListener(new
74: menuItemSetup.setText("\u8bbe\u7f6e");
75: menuItemSetup.addActionListener(new 76: java.awt.event.ActionListener() {
77: public void actionPerformed(java.awt.event.ActionEvent evt) { 78: menuItemSetupActionPerformed(evt);
79: }
92: menuItemExitActionPerformed(java.awt.event.ActionEvent evt) { 93: //退出程序
94: exit();
95: } 96:
97: private void
98: formWindowClosing(java.awt.event.WindowEvent evt) { 99: //退出程序
100: exit();
101: } 102:
103: private void
104: menuItemSetupActionPerformed(java.awt.event.ActionEvent evt) { 105: // 功能设置
106: mainPanel.setup();
107: } 108:
109: private void
110: menuItemOpenActionPerformed(java.awt.event.ActionEvent evt) { 111: // 打开词库文件
112: mainPanel.open();
113: } 114:
115: public static void main(String args[]) { 116: try {
117: UIManager.setLookAndFeel(
118: "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
119: } catch (Exception e){
120: e.printStackTrace();
121: }
122: java.awt.EventQueue.invokeLater(new Runnable() {
123: public void run() {
129: private void exit(){
130: int selection=JOptionPane.showConfirmDialog(this,
131: "是否立即退出系统?","操作提示",JOptionPane.OK_CANCEL_OPTION, 132: JOptionPane.WARNING_MESSAGE); 138: private javax.swing.JMenuBar menuBar;
139: private javax.swing.JMenu menuFile;
140: private javax.swing.JMenuItem menuItemExit;
141: private javax.swing.JMenuItem menuItemOpen;
142: private javax.swing.JMenuItem menuItemSetup;
143: private javax.swing.JMenu menuView;
144: // 变量声明结束
145: private MainPanel mainPanel;//主面板 146: