SWT与级联MenuItem加速器有关

时间:2012-08-31 16:51:59

标签: java menu swt

按下加速键组合时,具有 SWT.CASCADE 样式(如'文件')的MenuItem对象不会下拉。

在下面的示例中,按Alt-F会触发Selection事件(我在控制台中看到“File”),但菜单本身不会下拉。我找不到以编程方式使菜单下拉的方法。有什么想法吗?

(我正在使用的包是随当前版本的Eclipse Juno提供的org.eclipse.swt.win32.win32.x86_64_3.100.0.v4233d.jar。)

public class MenuTest {
    public static void main(String[] args) {
        Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        Menu menu = new Menu(shell, SWT.BAR);

        MenuItem item = new MenuItem(menu, SWT.CASCADE);
        item.setText("File");
        item.setAccelerator(SWT.ALT | 'F');
        Menu dropMenu = new Menu(shell, SWT.DROP_DOWN);

        item.setMenu(dropMenu);
        item.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                System.out.println("File");
            }
        });

        item = new MenuItem(dropMenu, SWT.NULL);
        item.setText("Close");
        item.setAccelerator(SWT.ALT | SWT.F4);
        item.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                System.out.println("Close");
                shell.dispose();
            }
        });

        shell.setMenuBar(menu);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码有 nothing wrong ,并且按预期工作。默认情况下,在Windows操作系统上,当用户按下Alt键时,菜单栏会收到输入焦点,并且使用Esc键丢失输入焦点(请参阅Keyboard accessibility section)。

现在,加速器就像热键/组合,可以让生活更轻松。在您的方案中,当您按 ALT + F 时,覆盖菜单焦点的 ALT 的默认行为将被覆盖。而且,这就是菜单监听器被触发但未显示下拉菜单的原因。

可能的解决方案

  1. 而不是item.setAccelerator(SWT.ALT | 'F');做这样的事情item.setAccelerator(SWT.MOD1 | 'F'); MOD1MOD2 .. MOD4是键盘和/或鼠标事件掩码,表示MOD1键已被按下生成事件时的键盘。
  2. 在Windows操作系统 you need not 上设置最顶级菜单的加速器。而是使用mnemonic。例如,item.setText("&File");。有关详细信息,请参阅setText()的javadoc。
  3. 或者,更加彻底How to disable normal behaviour of Alt key?(它是一个C ++解决方案)
  4. 助记符的结果

    请参阅F的{​​{1}}下的下划线。

    enter image description here