SWT与级联MenuItem加速器有关

按下加速键组合时,具有SWT.CASCADE样式(如’File’)的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(); } } 

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

现在,加速器就像热键/组合,可以让生活更轻松。 在您的方案中,当您按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. 或者,更彻底地如何禁用Alt键的正常行为? (它是一个C ++解决方案)

助记符的结果

请参阅File F下的下划线。

在此处输入图像描述