0

Nimbus L&F で Enter キーを押すと、ボタンにフォーカスがある場合、別のボタンが次のようにデフォルトとして設定されているかどうかに関係なく、そのボタンがクリックされます。

getRootPane().setDefaultButton(myButton);

また、キーバインディングを使用しても機能しません:

Action clickDefault = new AbstractAction("clickDefault") {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Got Here");
        getRootPane().getDefaultButton().doClick();
    }
};
InputMap im = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
im.put(enter, "defaultButton");
getRootPane().getActionMap().put("defaultButton", clickDefault);

「Got Here」メッセージすら表示されませんが、「P」などの別の KeyStroke にバインドすると、期待どおりに機能します。そのため、このイベント ハンドラーに到達する前に Enter キーがキャプチャされているように見えます。

UIDefaults の変更も試みました。

    im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
    im.put(enter, null);
    im.put(enterRelease, null);

それも失敗しました。これを達成する方法はありますか?

---アップデート---

さらに調査した結果、JButton の InputMap には {"pressed Enter": "pressed", "released ENTER": "released"} (および SPACE のバインド) が含まれていることが明らかになりました。問題のコンポーネントのキー バインディングは、RootPane よりも優先されます。問題を解決するコードについては、以下の私の回答を参照してください。

4

2 に答える 2

0

さて、ついに私が望むようにこれを機能させる方法を見つけました。これが私が使用しているコードです:

public class Main {
    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {

            // Use Nimbus if it's available and we're not on Mac OSX
            if (!System.getProperty("os.name").equals("Mac OS X")) {
                try {
                    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());

                            ((InputMap) UIManager.get("Button.focusInputMap"))
                                    .put(KeyStroke.getKeyStroke("pressed ENTER"), null);
                            ((InputMap) UIManager.get("Button.focusInputMap"))
                                    .put(KeyStroke.getKeyStroke("released ENTER"), null);

                            break;
                        }
                    }
                } catch (Exception e) {
                    // Default Look and Feel will be used
                }
            }

            MainWindow mainWindow = new MainWindow();
            mainWindow.setVisible(true);
        }
    });
}

}//クラスメインを終了

私が理解した重要なことの1つは、ルックアンドフィールを設定した後にInputMapを更新する必要があるということでした。私はこれらのことをいじるときにそれが必要であることに気づいていませんでしたが、それでも私はこのルックアンドフィールビジネス全体に慣れていません。

于 2011-03-03T05:34:33.450 に答える
0

私は Nimbus LAF を使用していないので、どのように機能するかわかりません。

Windows LAF では、既定のボタンは現在フォーカスのあるボタンに自動的に変更されます。これは、フォーカスのあるボタンの境界線が濃いことで示されます。フォーカスがボタンにない場合、暗い境界線はデフォルト ボタンにリセットされます。

Windows では、次を使用してこの動作を無効にすることができます。

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

これで、暗い境界線がデフォルト ボタンに残り、Enter キーがデフォルト ボタンをアクティブにします。フォーカスのあるボタンは、スペース バーを使用してクリックすることができます。

于 2011-03-03T04:45:15.813 に答える