IBM SWT 菜单

除了最基本的 GUI 应用程序之外,几乎所有的 GUI 应用程序都需要菜单。菜单增加了任何 GUI 的可用性。菜单是动态呈现的选择列表,它对应于可用的函数(常称为命令)或 GUI 状态。正如您所期望的,您可以使用菜单小部件创建菜单。菜单可以包含其他菜单或者menuItems(菜单项),而 menuItems 也可以包含菜单(即分层的菜单)。menuItems 表示您可以执行的命令或您所选择的 GUI 状态。菜单可以与应用程序(即 shell)的菜单栏相关,或者,这些菜单可以是漂浮在应用程序窗口之上的弹出式菜单。

必须将菜单定义为以下三种互斥样式之一:

  1. BAR 充当 shell 的菜单栏。
  2. DROP_DOWN 从菜单栏或一个菜单项往下拉。
  3. POP_UP 从 shell 弹出,但上下文则针对于一个特定的控件。

菜单支持一些附加的可选样式:

  • NO_RADIO_GROUP 不充当单选按钮组;当菜单中包含 RADIO 样式的菜单项时可以使用它。
  • LEFT_TO_RIGHT RIGHT_TO_LEFT 负责选择文本方向。

必须将菜单项定义为以下 5 种互斥样式之一:

  1. CHECK 可以是持久选定的(即复选的)。
  2. CASCADE 包含一个应该以下拉方式出现的菜单。
  3. PUSH 行为类似于造成某一直接动作的按钮。
  4. RADIO 行为类似于一个 CHECK,但是只有一个这种类型的项被选中。
  5. SEPARATOR 充当菜单项的组之间的隔离物(通常是一个条),这一项没有任何功能。

创建一个菜单系统是相当复杂的。清单 1 显示了一个代码示例,该示例创建了一个可操作的菜单系统。


清单 1. 创建一个菜单系统和一个弹出菜单

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
  :
Shell shell = ...;
  :
Label body = ...;
  :
// Create the menu bar system
Menu main = createMenu(shell, SWT.BAR | SWT.LEFT_TO_RIGHT);
shell.setMenuBar(main);
MenuItem fileMenuItem = createMenuItem(main, SWT.CASCADE, "&File", 
                                       null, -1, true, null);
Menu fileMenu = createMenu(shell, SWT.DROP_DOWN, fileMenuItem, true);
MenuItem exitMenuItem = createMenuItem(fileMenu, SWT.PUSH, "E&xit/tCtrl+X", 
                                       null, SWT.CTRL + 'X', true, "doExit");
MenuItem helpMenuItem = createMenuItem(main, SWT.CASCADE, "&Help", 
                                       null, -1, true, null);
Menu helpMenu = createMenu(shell, SWT.DROP_DOWN, helpMenuItem, true);
MenuItem aboutMenuItem = createMenuItem(helpMenu, SWT.PUSH, "&About/tCtrl+A", 
                                        null, SWT.CTRL + 'A', true, "doAbout");
// add popup menu
Menu popup = createPopupMenu(shell, body);
MenuItem popupMenuItem1 = createMenuItem(popup, SWT.PUSH, "&About", 
                                         null, -1, true, "doAbout");
MenuItem popupMenuItem2 = createMenuItem(popup, SWT.PUSH, "&Noop", 
                                         null, -1, true, "doNothing");

 

此代码序列创建了以下菜单栏,该菜单栏中包含一些子菜单和一个弹出菜单。body 值是一个标签控件,包含文本“Sample body”。弹出菜单与这个控件在上下文上存在关联。

 

正如您所见,菜单项可以具有加速器(Ctrl+?)和记忆术(给通过 & 标识的字符加下划线),帮助用户使用键盘选择一些项。

我使用一组 helper 方法创建了这些菜单,如清单 2 中所示。最佳实践是创建与这些 helper 方法类似的方法,用这些方法创建重复的 GUI 部分,如菜单。随着时间的推移,您可以向这些 helper 方法添加更多的支持功能,并将它们应用到所有使用点。这些方法还有助于提示您获得所有需要的值。


清单 2. 菜单创建 helper 例程

protected Menu createMenu(Menu parent, boolean enabled) {
    Menu m = new Menu(parent);
    m.setEnabled(enabled);
    return m;
}
protected Menu createMenu(MenuItem parent, boolean enabled) {
    Menu m = new Menu(parent);
    m.setEnabled(enabled);
    return m;
}
protected Menu createMenu(Shell parent, int style) {
    Menu m = new Menu(parent, style);
    return m;
}
protected Menu createMenu(Shell parent, int style, 
                          MenuItem container, boolean enabled) {
    Menu m = createMenu(parent, style);
    m.setEnabled(enabled);
    container.setMenu(m);
    return m;
}
protected Menu createPopupMenu(Shell shell) {
    Menu m = new Menu(shell, SWT.POP_UP);
    shell.setMenu(m);
    return m;
}
protected Menu createPopupMenu(Shell shell, Control owner) {
    Menu m = createPopupMenu(shell);
    owner.setMenu(m);
    return m;
}
protected MenuItem createMenuItem(Menu parent, int style, String text, 
                                  Image icon, int accel, boolean enabled, 
                                  String callback) {
    MenuItem mi = new MenuItem(parent, style);
    if (text != null) {
        mi.setText(text);
    }
    if (icon != null) {
        mi.setImage(icon);
    }
    if (accel != -1) {
        mi.setAccelerator(accel);
    }
    mi.setEnabled(enabled);
    if (callback != null) {
        registerCallback(mi, this, callback);
    }
    return mi;
}

清单 3 显示了如何使用 Java 的反射 功能,利用处理菜单项的代码来链接菜单项。此功能创建了一个易于使用的方法,在这个方法中,只需要给应用程序类添加一个 public 方法(比如 doExitdoAboutdoNothing),就可以处理菜单命令。


清单 3. 处理菜单命令的 Callback 例程

protected void registerCallback(final MenuItem mi, 
                                final Object handler, 
                                final String handlerName) {
    mi.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            try {
                Method m = handler.getClass().getMethod(handlerName, null);
                m.invoke(handler, null);
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    });
}

请注意,菜单项(以及稍后讨论的列表、表、和树控件中的项)只支持字符串值;在添加其他类型的值之前,这些值将被转换成字符串值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值