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

时间:2009-05-21 09:35:39

标签: java swing

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

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

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

  • 的LookAndFeel

  • BasicLookAndFeel中

    • MetalLookAndFeel
    • 的MotifLookAndFeel
    • WindowsLookAndFeel
  • MultiLookAndFeel

在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)

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

  1. 使用您想要进行的少量更改创建一个新地图。
  2. 查询您的组件的地图
  3. 将该地图设为新地图的父级
  4. 在组件中安装新地图
  5. 这样您的修改就会覆盖并扩展现有的映射。

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

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

    通过这种方式,您的代码可以运行(可能多年),如果它中断,它会主动告诉您有关更改的信息。