2

JButtonでボタンを明示的に構成しない限り、クリックしたときに自動的にフォーカスを取得しないようです.setRequestFocusEnabled(true)。私が使用しているアプリケーションには、多くの異なる場所 (つまり、ファクトリ メソッド経由ではない) に作成された多くのボタンがあり、クリックしたときにフォーカスを要求するには、それらすべてが必要です。

たとえば、いくつかのプロパティを設定することにより、ボタンがデフォルトでクリック時にフォーカスを要求するように、デフォルトの動作を変更する簡単な方法はありますか? それとも、それらをすべて探し出して.setRequestFocusEnabled(true)、各ボタンを 1 つずつ呼び出す必要がありますか?

4

2 に答える 2

1

JButtonは、クリックされたときにフォーカスを取得する必要があります。おそらく、それを行わないように変更されたボタンがあります。しかし、それはyoirの問題を解決しません。

UI全体が作成された後でボタンを変更できます(GUIが開いているときに変更されないと仮定します)。この方法では、フレーム/ダイアログごとに1つの呼び出しサイトのみが必要です。

public static class FocusHelper {
    public static void alterButtons(Component container) {
        if (component instanceof Container) {
            Component[] children = ((Container) component).getComponents();
            for (Component child : children) {
                alterButtons(child);
            }
        } else if (component instanceof JButton) {
            ((JButton) component).setRequestFocusEnabled(true);
        }
    }
}

ヘルパーメソッドは、コンポーネント階層全体をスキャンしてボタンを探し、各JButtonに対してsetRequestFocusEnabled()を呼び出します(達成したい内容に応じて、AbstractButtonなどの他のコンポーネントタイプを確認することもできます)。GUIが作成された場所からメソッドを呼び出し、最上位のコンテナー(JFrame、JDialog、またはその他のコンテナーコンポーネント)を渡すだけです。

于 2012-09-14T15:31:16.337 に答える
0

おそらく、JButton から継承するサブクラスを作成し、そこに機能を実装することができます。

public class MyJButton extends JButton {
    public MyJButton(String string, Icon icon) {
        super(string, icon);
        this.setRequestFocusEnabled(true);
    }

    public MyJButton(Action action) {
        super(action);
        this.setRequestFocusEnabled(true);
    }

    public MyJButton(String string) {
        super(string);
        this.setRequestFocusEnabled(true);
    }

    public MyJButton(Icon icon) {
        super(icon);
        this.setRequestFocusEnabled(true);
    }

    public MyJButton() {
        super();
        this.setRequestFocusEnabled(true);
    }
}

ここで、すべての JButton を MyJButton オブジェクトに置き換える必要があります

于 2012-09-14T08:20:42.800 に答える