0

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

1 に答える 1

1

nothing wrongあなたのコードにあり、それは期待通りに機能しています。Windows OSのデフォルトでは、ユーザーがAltキーを押すとメニューバーが入力フォーカスを受け取り、Escキーで入力フォーカスを失います(キーボードのアクセシビリティのセクションを参照)。

今、アクセラレータは、人の生活を楽にするためにあるホットキー/組み合わせのようなものです。シナリオでは、を押すと、メニューにフォーカスを設定するというALT + Fデフォルトの動作ALTが上書きされます。そして、それがメニューリスナーが起動される理由ですが、ドロップダウンメニューは表示されません。

考えられる解決策

  1. item.setAccelerator(SWT.ALT | 'F');このようなことをする代わりにitem.setAccelerator(SWT.MOD1 | 'F');ここ MOD1で、MOD2 .. MOD4は、イベントが生成されたときにMOD1キーがキーボードで押されたことを示すキーボードおよび/またはマウスのイベントマスクです。
  2. Windows OSyou need notで、最上位メニューのアクセラレータを設定します。代わりに。を使用してmnemonicください。たとえば、item.setText("&File");。詳細については、のjavadocを参照setText()してください。
  3. または、より大幅にAltキーの通常の動作を無効にする方法は?(そのC ++ソリューション)

ニーモニックの結果

の下線を参照してFくださいFile

ここに画像の説明を入力してください

于 2012-09-04T18:18:18.143 に答える