• 沒有找到結果。

菜 单 是 非 常 重 要 的 GUI 组 件 。 Java 的 菜 单 组 件 是 由 多 个 类 组 成 的 , 其 中 , java.awt.MenuComponent 类是所有菜单类的父类,它的子类有:MenuBar(菜单条)、Menu(菜 单)、MenuItem(菜单子项)、CheckboxMenuItem(复选框菜单子项)、PopupMenu(弹出菜单)。

此外,还有一个用于产生快捷键的类:MenuShortcut。

每个菜单组件都包括一个菜单条,每个菜单条又包含若干个菜单项,每个菜单项再包含 若干个菜单子项。菜单子项的作用与按钮类似,当用户单击时产生一个命令动作。

Java 中的菜单分为两大类:一类是菜单条式菜单,通常所说的菜单就是这一类;另一类 就是弹出式菜单。

创建一个菜单的步骤如下:

(1)创建菜单条。菜单条组件是一个水平菜单。它只能加入到一个框架中,并成为所有菜 单树的根。在一个时刻,一个框架可以显示一个菜单条。然而,可以根据程序的状态修改菜单 条,这样,在不同的时刻就可以显示不同的菜单。一般使用 MenuBar 组件,菜单条外观如图 4.25 所示。

图 4.25 菜单条外观

为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。

MenuBar 组件只有一种构造方式,但是它对于构造一个菜单来说是个不可缺少的组件。

(2)创建菜单项,添加到菜单条中。

使用 Menu 组件。Menu 组件是用来存放和整合 MenuItem 的组件,这个组件也是构成一 个菜单不可或缺的组件之一。Menu 可以是单一层次的结构也可以是一个层次式的结构,要使 用何种形式的结构取决于界面设计上的需要而定。

(3)将菜单子项加入到菜单项中,菜单子项是菜单树的“叶”节点。

使用 MenuItem 组件。MenuItem 继承 AbstractButton 类,可以说 MenuItem 是一种特殊的 Button,所以 MenuItem 支持许多在 Button 中好用的功能,例如加入图标文件或是在菜单中选 择某一项 MenuItem 时就如同按下按钮的操作一样触发 ActionEvent,通过 ActionEvent 的机制 就能针对不同的 MenuItem 编写其对应的程序段。

(4)将建成的菜单条加入到容器中。

(5)将菜单子项注册给动作事件的监听者 ActionListener。

(6)重载监听者的方法 actionPerformed(ActionEvent e)。

【例 4.24】创建菜单示例。

//MenuDemo.java

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class MenuDemo extends Frame implements ActionListener { Menu objMenuFile;

Menu objMenuEdit;

Label lblMsg;

public void init() {

setBackground(Color.white);

buildMenuFile();

buildMenuEdit();

MenuBar objMenuBar = new MenuBar();

setMenuBar(objMenuBar);

objMenuBar.add(objMenuFile);

objMenuBar.add(objMenuEdit);

lblMsg = new Label("显示的消息.");

add(lblMsg);

}

private void buildMenuFile() { MenuItem objMenuItem;

objMenuFile = new Menu("文件");

objMenuItem = new MenuItem("新建");

objMenuItem.addActionListener(this);

objMenuFile.add(objMenuItem);

objMenuItem = new MenuItem("打开");

objMenuItem.addActionListener(this);

objMenuFile.add(objMenuItem);

objMenuItem = new MenuItem("保存");

objMenuItem.addActionListener(this);

objMenuFile.add(objMenuItem);

objMenuItem = new MenuItem("另存为");

objMenuItem.addActionListener(this);

objMenuFile.add(objMenuItem);

objMenuFile.addSeparator(); // 添加水平分割线 objMenuItem = new MenuItem("退出");

objMenuItem.addActionListener(this);

objMenuFile.add(objMenuItem);

}

private void buildMenuEdit() { MenuItem objMenuItem;

objMenuEdit = new Menu("编辑");

objMenuItem = new MenuItem("撤销");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuItem = new MenuItem("重做");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuEdit.addSeparator();

objMenuItem = new MenuItem("剪切");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuItem = new MenuItem("复制");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuItem = new MenuItem("粘贴");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuItem = new MenuItem("删除");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuEdit.addSeparator();

objMenuItem = new MenuItem("查找");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

objMenuItem = new MenuItem("替换");

objMenuItem.addActionListener(this);

objMenuEdit.add(objMenuItem);

}

public void actionPerformed(ActionEvent event) { String strMenuName;

strMenuName = event.getActionCommand();

if (strMenuName.equals("退出")) { System.exit(0);

} else {

lblMsg.setText(strMenuName + "菜单 被选择.");

} }

public static void main(String args[]) {

MenuDemo objAppFrame = new MenuDemo();

// 注册监听器

objAppFrame.addWindowListener(

new WindowAdapter() {

public void windowClosing(WindowEvent e) { System.exit(0);

} });

objAppFrame.setTitle("菜单示例");

objAppFrame.setSize(760, 378); // 设置窗口的高度和宽度 objAppFrame.init();

objAppFrame.setVisible(true);

} }

程序运行结果如图 4.26 所示。

图 4.26 例 4.24 程序运行的部分结果

相關文件