Java 如何全局更改Swing JTextFields的ActionMap?

Java 如何全局更改Swing JTextFields的ActionMap?,java,swing,jtextfield,jtextcomponent,uimanager,Java,Swing,Jtextfield,Jtextcomponent,Uimanager,我想通过用自定义实现替换一些操作来更改整个应用程序中Swing JTextFields的ActionMap。有关解释,请参阅以下帖子: 如果我这样做,效果会很好: ActionMap map = (ActionMap)UIManager.get("TextField.actionMap"); map.put(DefaultEditorKit.backwardAction, new MyCustomAction()); 现在唯一剩下的问题是,到目前为止,当我在JTextField的第一次实例化

我想通过用自定义实现替换一些操作来更改整个应用程序中Swing JTextFields的ActionMap。有关解释,请参阅以下帖子:

如果我这样做,效果会很好:

ActionMap map = (ActionMap)UIManager.get("TextField.actionMap");
map.put(DefaultEditorKit.backwardAction, new MyCustomAction());
现在唯一剩下的问题是,到目前为止,当我在JTextField的第一次实例化之后执行代码时,我只让它起作用。但是,理想情况下,我希望将此代码集成到一个定制的外观或其他不需要了解应用程序的中心位置。召唤

UIManager.getDefaults()
首先,这不会改变任何事情。UIManager.get(“TextField.actionMap”)返回的映射在之后仍然为空


现在,我不得不在应用程序的某些初始化方法中添加一个新的JTextField(),然后操作非常难看的动作映射。

共享父动作映射是在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和创建实例之后进行


虽然感觉很难看,但没有办法

你可以通过扩展
JTextField
来创建你自己的
JTextField
(比如
MyTextField
),并更改那里的
ActionMap
。然后在整个程序中使用该类的重写版本。我脑子里唯一能想到的就是创建你自己的UI委托,但是,这将需要为您打算支持的每个平台提供一个非常好的问题,+1,
没有办法解决,尽管感觉很难看。
这也是我昨天得出的结论。我希望你有更积极的见解。