2

で最初にJMenuBarアクティブにしようとしますが、ポップアップを開かずに、後で矢印キーストロークでポップアップを開くことができるようにします。NetBeans、Mozilla、その他のプログラム ウィンドウで行われるのと同じように。JMenuAlt KeyEvent

意図したとおりに動作しないコードを次に示します。最悪の副作用は、それが alt+tab の組み合わせに反応することであり、間違いなくalt+でメニューをポップアップすべきではありませんtab。メニューを「武装」状態にし、矢印キーでメニューをトラバースできるようにする必要があります(左右の矢印で「武装」メニューに、下矢印で「武装」メニューポップアップを開きます)。これを実現する簡単な方法はありますか?

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;

public class Test5 extends JFrame {

    public Test5() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pan = new JPanel(new BorderLayout());

        final JMenuBar bar = new JMenuBar();
        final JMenu menu = new JMenu("File", false);

        menu.setMnemonic(KeyEvent.VK_ALT);

        JMenuItem item = new JMenuItem("All");
        JMenuItem item2 = new JMenuItem("Exit");
        menu.add(item);
        menu.add(item2);

        JMenu menu1 = new JMenu("Test");
        JMenuItem item1 = new JMenuItem("All");
        menu1.add(item1);

        bar.add(menu);
        bar.add(menu1);

        setJMenuBar(bar);

        setSize(200, 200);
        setVisible(true);
    }


    public static void main(String[] args) {
        new Test5();
    }

}

Guillaume Polet のおかげで解決しました: com.sun.java.swing.plaf.windows.WindowsLookAndFeel クラスには、Alt キーストロークで動作するコードがいくつかあります。

public void initialize() {
    super.initialize();
    // some more initialization here
    KeyboardFocusManager.getCurrentKeyboardFocusManager()
                        .addKeyEventPostProcessor(WindowsRootPaneUI.altProcessor);
}

そして、AltProcessor クラスがすべての魔法を行います。

カスタム LaF がない場合は、WindowsLookAndFeel をそのまま使用できます。または、独自の特別な LaF のメニューで Alt イベントを処理する方法の適切な例があります。

4

2 に答える 2

3

GUI を開始する前に、次の行を呼び出します。

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

そして、ニーモニックを削除します。

これにより、必要な動作が Windows に自動的にインストールされます。すべてのプラットフォームでこれが必要な場合は、KeyBindings を使用する必要がありますが、この動作は Windows でのみ観察されるため、Windows でのみ再作成しても問題はないと思います。

于 2012-11-20T14:00:30.103 に答える
1

理由はわかりませんが、質問への回答について

  • 1段目

    1. KeyBindingsを使用し、 Swing Action (推奨)またはActionListenerへの出力を使用する必要があります。

    2. 2つの方法があるmenu.setArmed(true)か、menu.setSelected(true)

  • ただし、どちらの場合も、JMenu永遠に選択されてから、必要な2番目に選択されます。MenuListenerを追加し、以前に選択したものまたは武装を false に復元する手順

于 2012-11-20T13:55:41.783 に答える