Swing组件的ActionMap中的默认操作名称是否标准化?

假设我有一个像JSlider这样的标准Swing组件,但我想略微调整输入映射。 默认输入映射和操作映射是按外观安装的,我想重用ActionMap中已有的一些操作。 为此,我需要将ActionMap条目的键放入InputMap条目的值中。

我可以在运行时使用调试器轻松查找ActionMap键(总是一个String),并重用它。 它将起作用 – 在我的JDK版本和L&F上得到保证。

所以问题是,在任何地方记录默认Swing组件操作的关键,它们是否“合法地”随时间变化(即从JDK版本到JDK版本或从L&F到L&F)并且您在实践中看到了这样的变化吗?

谢谢。

好吧我花了一段时间来搜索它。

简而言之,它们似乎没有标准化(很多),并且它们看起来没有被记录(很多)。

LookAndFeel类是关键。 这是层次结构:

  • 的LookAndFeel

  • BasicLookAndFeel中

    • MetalLookAndFeel
    • 的MotifLookAndFeel
    • WindowsLookAndFeel
  • MultiLookAndFeel

在BasicLookAndFeel类中,您可以找到操作和键绑定的默认映射,这些映射将由所有其他类inheritance。 所以你可以认为这个类是标准的 。 您可以在创建对象“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"; 

ActionMapInputMapgetParent()setParent() ,因此解决方案是:

  1. 创建一个包含您想要进行的少量更改的新地图。
  2. 查询组件的映射
  3. 将该地图设置为新地图的父级
  4. 在组件中安装新映射

这样您的修改就会覆盖并扩展现有的映射。

[编辑]我不知道任何地方都有一个列表。 但是像maxScroll这样的maxScroll应该是“稳定的”,即它们应该存在于未来的版本中(并不是说Swing在过去的10年中发生了很大变化……)

因此,如果您需要替换某个映射,请使用上面的方法。 这样,您可以保留L&F的所有现有映射(即使您犯了错误,也可以保持组件的可用性)。 如果您依赖于覆盖某个键,那么我建议检查该键是否存在,并在它突然消失时抛出错误。

这样,您的代码就可以运行(可能多年),如果它破坏了,它会主动告诉您有关更改的信息。