2

ユーザーが「ALT」キーを押したときに、jmenubar 内で jmenu を自動選択する方法はありますか? (ウィンドウズソフトみたいに)

問題は、「ALT」キーが押されたときの私のjframeのデフォルトの動作は、復元、移動、サイズ変更、縮小などのアクションを含むメニューを表示することです...

Java アプリケーションに実行させたいことは、「alt」が押されたときに jmenu の最初の項目を選択することです。(ニーモニックで行うように:「alt + f」)

4

4 に答える 4

7

ActionMapのとにアクションを追加しInputMapますJRootPane。下記参照:

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


public class MenuExample {

    private void setupMenuKey(final JFrame frame) {
        Action menuAction = new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JRootPane rootPane = frame.getRootPane();
                JMenuBar jMenuBar = rootPane.getJMenuBar();
                JMenu menu = jMenuBar.getMenu(0);
                menu.doClick();
            }
        };

        JRootPane rootPane = frame.getRootPane();
        ActionMap actionMap = rootPane.getActionMap();

        final String MENU_ACTION_KEY = "expand_that_first_menu_please";
        actionMap.put(MENU_ACTION_KEY, menuAction);
        InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), MENU_ACTION_KEY);
    }


    private JFrame build() {
        JFrame frame = new JFrame("Hello");
        frame.setSize(300, 300);

        JMenuBar bar = new JMenuBar();

        List<String> letters = Arrays.asList("A", "B", "C");
        for (int i = 0; i < 3; i++) {
            JMenu menu = new JMenu("Menu " + i);
            for (String string : letters) {
                menu.add(new JMenuItem(String.format("Menu %s - %s", i, string)));
            }
            bar.add(menu);
        }
        frame.setJMenuBar(bar);

        JButton b = new JButton("click");
        JPanel p = new JPanel();
        p.add(b);
        frame.add(p);
        setupMenuKey(frame);

        return frame;
    }

    public static void main(String[] args) {
        MenuExample menuExample = new MenuExample();
        JFrame frame = menuExample.build();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


}
于 2011-12-28T17:21:53.193 に答える
0

応答は非常に便利ですが、欠点もあります。

Cross PlatForm L&F (Metal) を使用していて、すべてのメニューにニーモニックを定義したとします。これらのメニューは、 を押すことに対して呼び出されることがわかっています。したがって、black panda が提供するソリューションを適用すると、プレスの結果は最初に展開された目的のメニューが表示されますが、すぐに最初のメニューに切り替わります。

最初のメニューのみを選択し、その内容を表示せずにALTを押すのが最善の方法だと思います(これらの内容は、下向きのキーを押すと表示されます)。Cross Platform L&F でこれを行う方法はありますか?

別の方法として、追加のコードを使用せずに続行する別の方法があります。システム L&F (私の場合は Windows) を呼び出すと、ALT キーは希望どおりに動作します。詳細については、stackoverflow の質問 13474555 を参照してください。

于 2013-07-02T11:02:56.760 に答える
0

frame.setJMenuBar(jmenubar);where frameis your JFrame とjmenubaris your JMenuBarを使用するだけで、これが自動的に行われることがわかりました。レイアウト マネージャーに追加する必要さえありません。

于 2015-02-19T05:55:33.887 に答える
0

この作業を行うには、JComponent の actionmap と inputmap を使用します。JFrame は JCompoenent の子孫ではないため、JPanel を jframe に追加してから、

Action action = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            jMenu1.doClick();
        }
    };
    jPanel1.getActionMap().put("myAction", action);
    jPanel1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, KeyEvent.ALT_DOWN_MASK), "myAction");
于 2011-12-28T17:18:04.173 に答える