【问题标题】:SWT issues with cascaded MenuItem accelerators级联 MenuItem 加速器的 SWT 问题
【发布时间】:2012-09-05 02:18:18
【问题描述】:

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

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

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

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();
    }
}

【问题讨论】:

  • @nick- SWT.CASCADE 对我有用,尽管我在 org.eclipse.swt.win32.win32.x86_3.100.0.v4233d.jar 上。你能发布一个运行的例子吗?
  • 加速器似乎可以工作,但菜单不会下拉。我重新表述了这个问题并添加了一个示例。

标签: java menu swt


【解决方案1】:

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

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

可能的解决方案

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

助记符结果

请参阅FileF 下方的下划线。

【讨论】:

  • 这行得通,非常感谢。 (此外,与号语法让我想起了不那么古老的 Win32 时代,我认为 SWT 以某种方式抽象了它。)
猜你喜欢
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多