2

いくつかのアクションをカスタム実装に置き換えることで、アプリケーション全体のSwingJTextFieldsのActionMapを変更したいと思います。次の投稿を参照できる理由の説明については、次のとおりです。

JTextComponentのキャレットに選択したテキストをスキップさせるにはどうすればよいですか?

これを行うと、これはうまく機能します。

ActionMap map = (ActionMap)UIManager.get("TextField.actionMap");
map.put(DefaultEditorKit.backwardAction, new MyCustomAction());

現在残っている唯一の問題は、これまでのところ、JTextFieldの最初のインスタンス化の後にそのコードを実行したときに、これが機能するようになっただけであるということです。ただし、理想的には、このコードをカスタムのルックアンドフィールまたはアプリケーションについて知る必要のない他の中心的な場所に統合したいと思います。呼び出し

UIManager.getDefaults()

最初は何も変更しません。UIManager.get( "TextField.actionMap")によって返されるマップは、その後もnullのままです。

現在、アプリケーションの初期化メソッドにダミーの新しいJTextField()を配置して、非常に醜いアクションマップを操作することに悩まされています。

4

1 に答える 1

2

共有の親 actionMap は、XXTextComponent の最初のインスタンスが uidelegate を取得した時点で作成されます。メソッドは BasicTextUI にあります。

/**
 * Fetch an action map to use.
 */
ActionMap getActionMap() {
    String mapName = getPropertyPrefix() + ".actionMap";
    ActionMap map = (ActionMap)UIManager.get(mapName);

    // JW: we are the first in this LAF
    if (map == null) {
        // JW: create map
        map = createActionMap();
        if (map != null) {
            // JW: store in LAF defaults
            UIManager.getLookAndFeelDefaults().put(mapName, map);
        }
    }
    ....
}

したがって、そのマップに追加する場合は、LAF設定してからインスタンスを作成した後に行う必要があります。

気持ち悪くても仕方がない。

于 2013-03-23T11:00:50.503 に答える