假设我有一个像JSlider这样的标准Swing组件,但我想略微调整输入映射。默认输入映射和操作映射是按外观安装的,我想重用ActionMap中已有的一些操作。为此,我需要将ActionMap条目的键放入InputMap的条目值。
我可以在运行时使用调试器轻松查找ActionMap键(总是一个String),并重用它。它将起作用 - 在我的JDK版本和L& F 上保证。
所以问题是,默认Swing组件操作的键是否记录在任何地方,它们是否“合法地”随时间变化(即从JDK版本到JDK版本或从L& F到L& F)并且让你在实践中看到了这样的变化?
感谢。
答案 0 :(得分:4)
好的,我花了一段时间来搜索它。
简而言之,它们似乎没有被标准化(很多)并且它们看起来没有被记录(很多)。
LookAndFeel类是关键。这是层次结构:
的LookAndFeel
BasicLookAndFeel中
在BasicLookAndFeel类中,您可以找到操作和键绑定的默认映射,这些映射将由所有其他类继承。因此,您可以将此类视为标准。您可以在创建对象“defaults”时看到,类似于498 for Java 1.4.2_17。
可以在实现者身上找到其他键绑定和覆盖,例如WindowsLookAndFeel。
某些标准名称可以在DefaultEditorKit类中找到,作为静态字段。这些似乎是安全的使用和重新映射。它们的用法可以在WindowsLookAndFeel和MotifLookAndFeel类中看到。假设这些行动将保持不变,我会感到安全。
简而言之,DefaultEditorKit中定义的Actions不太可能改变。然而,密钥绑定在L& F实现之间完全改变。使用DefaultEditorKit.something从地图中检索操作,它应该适用于各个版本。可以与JSlider一起使用的DefaultEditorAction示例:
/**
* Name of the Action for extending the selection
* by moving the caret logically forward one position.
* @see #getActions
*/
public static final String selectionForwardAction = "selection-forward";
答案 1 :(得分:3)
ActionMap
和InputMap
有getParent()
和setParent()
,因此解决方案是:
这样您的修改就会覆盖并扩展现有的映射。
[编辑]我不知道任何地方都有一个列表。但像maxScroll
这样的东西应该是“稳定的”,即它们应该存在于未来版本中(并不是说Swing在过去10年中发生了很大变化......)
因此,如果您需要替换某个映射,请使用上述方法。这样,您可以保留L& F的所有现有映射(即使您犯了错误,也可以保持组件的可用性)。如果您依赖于覆盖某个键,那么我建议检查该键是否存在,如果它突然消失则抛出错误。
通过这种方式,您的代码可以运行(可能多年),如果它中断,它会主动告诉您有关更改的信息。