12

Metal ルック アンド フィールを使用して Java Swing アプリケーションを作成しています。アプリケーションに JButton があるたびに、ユーザーは Tab キーを使用してフォーカスをボタンに移動し、Enter キーを押します。何も起こりません!スペース キーを押すと、ボタン イベントが発生します。Space キーと同じイベントをトリガーするように Enter キーを割り当てるにはどうすればよいですか? ご協力ありがとうございました。

4

6 に答える 6

18

私は以下を見つけました:

http://tips4java.wordpress.com/2008/10/25/enter-key-and-button/

Rob Camick が JDK5 以降を使用する場合は、単純に追加すると書いています...

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

...問題を解決するためのアプリケーションに。これは私にとってはうまくいきました!そして、これ以上簡単なことは想像できません。ただし、古いバージョンの Java を使用する場合は、Richard と Peter がこの質問への回答で説明しているようなことを行う必要があります。

于 2009-01-13T19:57:17.687 に答える
4

ここに完全な例があります。リチャードは近くにいましたが、押された ENTER をリリースするだけでなく、アクションにマップする必要もあります。すべてのボタンで機能するようにするために、このマッピングをボタンのデフォルトの入力マップに配置しました。インポートを追加すると、実行可能になります。


public class Main implements Runnable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Main());
    }

    @Override
    public void run() {
        setupEnterActionForAllButtons();

        JFrame frame = new JFrame("Button test");
        frame.getContentPane().add(createButton(), BorderLayout.NORTH);
        frame.getContentPane().add(createButton(), BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    private void setupEnterActionForAllButtons() {
        InputMap im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
        Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
        Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));

        im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
        im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
    }

    private JButton createButton() {
        JButton b = new JButton("press enter");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Pressed");
            }
        });

        return b;
    }
}
于 2009-01-13T19:34:33.803 に答える
1

実際、これは見た目の問題です。どのキーがフォーカスされたボタンをトリガーするかは、ルック アンド フィール次第です (そうあるべきです)。

「デフォルト ボタン」の回避策は、使用している L&F がデフォルト ボタンにエンターを使用しているため機能します。

Peter の回避策では、L&F のデフォルトの「フォーカス アクション」キーが明示的に変更されています。

多くのユーザーがタブでボタンに移動してから Enter キーを押したいとは思わないことを付け加えておきます (ほとんどの人は、フォーカス インジケーターにさえ気付かないでしょう)。入力。Richard が示唆しているように、これは入力マップでのみ行うことができます。

何かをグローバルに変更する前に、ユーザーが実際に何を望み、何を期待しているか (できれば、ユーザーが使用する他のアプリを参照して) を非常に明確に把握することをお勧めします。

于 2009-01-14T02:46:41.713 に答える
0

「デフォルトボタン」を最近フォーカスされたボタンに設定することもできます。

私はこれをアプリケーションで実行しましたが、これを実行するすべての方法は、保守とデバッグにとって悪夢です。事実、これは明らかにSwingの設計者が意図したことではありません。

于 2009-01-13T19:18:34.710 に答える
0

You do it by assigning an input / action map for the Enter key. Something like the following:

// save the command mapping for space
Object spaceMap = button.getInputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
// add a mapping from enter to the same command.
button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),spaceMap); 
于 2009-01-13T18:55:08.593 に答える