我想通过用自定义实现替换一些动作来更改整个应用程序中Swing JTextFields的ActionMap。有关为何可以参考以下帖子的说明:
How do I make the caret of a JTextComponent skip selected text?
如果执行此操作,则效果很好:
ActionMap map = (ActionMap)UIManager.get("TextField.actionMap");
map.put(DefaultEditorKit.backwardAction, new MyCustomAction());
现在唯一剩下的问题是,到目前为止,当我在JTextField的第一个实例化之后执行该代码时,我只能使它起作用。但是,理想情况下,我希望将此代码集成到不需要了解应用程序的自定义外观或其他中央位置。呼唤
UIManager.getDefaults()
首先不会改变任何东西。此后,UIManager.get(“ TextField.actionMap”)返回的地图仍然为null。
现在,我被困在应用程序的某些初始化方法中,将一个虚拟的new JTextField()放置在其中,然后操作动作图,这非常丑陋。
最佳答案
XXTextComponent的第一个实例获取其uidelegate时即创建了共享的父actionMap。该方法在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之后和创建实例之后进行。
即使感觉很丑,也没有办法。