java - SWT 与级联 MenuItem 加速器相关的问题

标签 java menu swt

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

在下面的示例中,按 Alt-F 会触发选择事件(我在控制台中看到"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();
    }
}

最佳答案

您的代码没有任何问题,并且它按预期工作。默认情况下,在 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 操作系统上您无需为最顶层菜单设置加速器。而是使用助记符。例如,item.setText("&File");。有关更多详细信息,请参阅 setText() 的 javadoc。
  3. 或者,更彻底地How to disable normal behaviour of Alt key? (它是一个 C++ 解决方案)

助记词结果

参见FileF下的下划线。

enter image description here

关于java - SWT 与级联 MenuItem 加速器相关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12219537/

相关文章:

java - 删除索引 N 处的元素,LinkedList

java - 最后关闭连接后如何处理返回结果集值(错误处理)?

java - 在 Android Stud 的 Java 中使表行可滚动

php - 数据库驱动的永无止境的菜单系统

java - 如何在 SWT 的子类中创建控件。然后在父类中使用它

SWT:单击后在工具栏按钮下方显示弹出菜单

java - "Fixing"SWT 表中的前几列,以防止它们水平滚动

java - if条件中的空值和空指针异常java

html - 响应式菜单问题 - 单击时不打开

python - 使用 PyGTK 的右键单击菜单(上下文菜单)