Java Swing JMenu和JPopupMenu:菜单和弹出式菜单

  • 内容
  • 评论
  • 相关

菜单由 Swing 中的 JMenu 类实现,可以包含多个菜单项和带分隔符的菜单。在菜单中,菜单项由 JMenuItem 类表示,分隔符由 JSeparator 类表示。

菜单本质上是带有关联 JPopupMenu 的按钮。当按下“按钮”时,就会显示 JPopupMenu。如果“按钮”位于 JMenuBar 上,则该菜单为顶层窗口。如果“按钮”是另一个菜单项,则 JPopupMenu 就是“下拉”菜单。

JMenu 类的常用方法

创建菜单常用构造方法有两个:JMenu() 和 JMenu(String s)。第一个构造方法创建一个无文本的 JMenu 对象,第二个构造方法创建一个带有指定文本的 JMenu 对象。JMenu 类的常用方法如表 1 所示。

表1 JMenu类的常用方法
方法名称 说明
add(Action a) 创建连接到指定 Action 对象的新菜单项,并将其追加到此菜单的末尾
add(Component c) 将某个组件追加到此菜单的末尾
add(Component c,int index) 将指定组件添加到此容器的给定位置
add(JMenuItem menultem) 将某个菜单项追加到此菜单的末尾
add(String s) 创建具有指定文本的新菜单项,并将其追加到此菜单的末尾
addSeparator() 将新分隔符追加到菜单的末尾
doCliclc(int pressTime) 以编程方式执行“单击”操作
getDelay() 返回子菜单向上或向下弹出前建议的延迟(以毫秒为单位)
getltem(int pos) 返回指定位置的 JMenuItem
getItemCount() 返回菜单上的项数,包括分隔符
getMenuComponent(int n) 返回位于位置 n 的组件
getMenuComponents() 返回菜单子组件的 Component 数组
getSubElements() 返回由 MenuElement 组成的数组,其中包含此菜单组件的子菜单
insert(JMenuItem mi,int pos) 在给定位置插入指定的 JMenuitem
insert(String s,pos) 在给定位置插入具有指定文本的新菜单项
insertSeparator(int index) 在指定的位置插入分隔符
isMenuComponent(Component c) 如果在子菜单层次结构中存在指定的组件,则返回 true
isPopupMenuVisible() 如果菜单的弹出窗口可见,则返回 rue
isSelected() 如果菜单是当前选择的(即高亮显示的)菜单,则返回 true
isTopLevelMenu() 如果菜单是“顶层菜单”(即菜单栏的直接子级),则返回 true
setDelay(int d) 设置菜单的 PopupMenu 向上或向下弹出前建议的延迟
setMenuLocation(int x,int y) 设置弹出组件的位置
setPopupMenuVisible(boolean b) 设置菜单弹出的可见性
setSelected(boolean b) 设置菜单的选择状态

例 1

菜单如果依附到 JMenuBar 对象上,则此菜单就是菜单栏中的菜单。菜单如果依附在 JPopupMenu 对象上,此菜单就是弹出式菜单。实现菜单栏和弹出式菜单的原理是一样的,但在具体的实现方式上有一些区别。

下面编写一个案例,使用 JMenuBar 类创建一个包含“文件”菜单和“编辑”菜单的菜单窗口。主要实现代码如下:

package ch18;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class JMenuDemo1 extends JMenuBar
{
    public JMenuDemo1()
    {
        add(createFileMenu());    //添加“文件”菜单
        add(createEditMenu());    //添加“编辑”菜单
        setVisible(true);
    }
    public static void main(String[] agrs)
    {
        JFrame frame=new JFrame("菜单栏");
        frame.setSize(300,200);
        frame.setJMenuBar(new JMenuDemo1());
        frame.setVisible(true);
    }
    //定义“文件”菜单
    private JMenu createFileMenu()
    {
        JMenu menu=new JMenu("文件(F)");
        menu.setMnemonic(KeyEvent.VK_F);    //设置快速访问符
        JMenuItem item=new JMenuItem("新建(N)",KeyEvent.VK_N);
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));
        menu.add(item);
        item=new JMenuItem("打开(O)",KeyEvent.VK_O);
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
        menu.add(item);
        item=new JMenuItem("保存(S)",KeyEvent.VK_S);
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
        menu.add(item);
        menu.addSeparator();
        item=new JMenuItem("退出(E)",KeyEvent.VK_E);
        item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK));
        menu.add(item);
        return menu;
    }
    //定义“编辑”菜单
    private JMenu createEditMenu()
    {
        JMenu menu=new JMenu("编辑(E)");
        menu.setMnemonic(KeyEvent.VK_E);
        JMenuItem item=new JMenuItem("撤销(U)",KeyEvent.VK_U);
        item.setEnabled(false);
        menu.add(item);
        menu.addSeparator();
        item=new JMenuItem("剪贴(T)",KeyEvent.VK_T);
        menu.add(item);
        item=new JMenuItem("复制(C)",KeyEvent.VK_C);
        menu.add(item);
        menu.addSeparator();
        JCheckBoxMenuItem cbMenuItem=new JCheckBoxMenuItem("自动换行");
        menu.add(cbMenuItem);
        return menu;
    }

}

上述代码调用 JMenu 对象的 setMnemonic() 方法设置当前菜单的快速访问符。该符号必须对应键盘上的一个键,并且应该使用 java.awt.event.KeyEvent 中定义的 VK—XXX 键代码之一指定。

提示:快速访问符是一种快捷键,通常在按下 Alt 键和某个字母时激活。例如,常用的 Alt+F 是“文件” 菜单的快速访问符。

JMenuItem 类实现的是菜单中的菜单项。菜单项本质上是位于列表中的按钮。当用户单击“按钮”时,则执行与菜单项关联的操作。JMenuItem 的常用构造方法有以下三个。

  1. JMenuItem(String text):创建带有指定文本的 JMenuItem。
  2. JMenuItem(String text,Icon icon):创建带有指定文本和图标的 JMenuItem。
  3. JMenuItem(String text,int mnemonic):创建带有指定文本和键盘助记符的 JMenuItem。

在该实例中,创建菜单项后调用 JMenuItem 对象的 setAccelerator(KeyStroke) 方法来设置修改键,它能直接调用菜单项的操作监听器而不必显示菜单的层次结构。在本实例中没有实现事件监听机制,所以使用快捷键时将得不到程序的任何响应,但是在菜单项中将出现快捷键。

运行该实例,图 1 所示是“文件”菜单展开效果,图 2 所示是“编辑”菜单展开的效果。

“文件”菜单
图1 “文件”菜单

本文标题:Java Swing JMenu和JPopupMenu:菜单和弹出式菜单

本文地址:https://www.hosteonscn.com/3601.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注