代码之家  ›  专栏  ›  技术社区  ›  sereda

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

  •  6
  • sereda  · 技术社区  · 15 年前

    假设我有一个标准的Swing组件,比如JSlider,但是我想稍微调整一下输入映射。默认输入映射和动作映射是按外观安装的,我希望重用ActionMap中已有的一些动作。为此,我需要将actionmap entry的键放入inputmap项的值中。

    我可以在运行时使用调试器轻松地查找actionmap键(始终是字符串),然后重用它。它会起作用的-保证 在我的JDK和L&F版本上 .

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

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Mario Ortegón    15 年前

    好吧,我花了一段时间才找到这个。

    简言之,它们似乎没有标准化(很多),也没有文档化(很多)。

    类的lookandfeel是关键。这是层次结构:

    • 外观和感觉

    • 基本感觉

      • 金属质感
      • Motiflook和Feel
      • 窗口外观
    • 多种外观和感觉

    在basicLookandFeel类中,可以找到操作和键绑定的默认映射,这些映射将由所有其他类继承。所以你可以认为这个班是 标准 . 您可以在创建对象“默认值”时看到,对于Java 1.4.2y17来说,类似于498。

    可以在实现程序(如WindowsLookandFeel)上找到其他键绑定和覆盖。

    一些 标准化 可以在defaulteditorkit类中找到静态字段的名称。这些似乎是安全的使用和重新映射。它们的用法可以在windowslookandfeel和motiflookandfeel类中看到。假设这些行为保持不变,我会感到安全。

    因此,简而言之,defaulteditorkit中定义的操作不太可能更改。但是,键绑定在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";
    
        2
  •  3
  •   Aaron Digulla    15 年前

    ActionMap InputMap getParent() setParent() ,所以解决方案是:

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

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

    [编辑]我不知道任何地方都有所有键的列表。但像 maxScroll 应该是“稳定的”,也就是说,它们应该存在于未来的版本中(在过去的10年中,变化并不大…)

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

    这样,您的代码就可以工作(可能会工作很多年),如果它中断了,它就会主动地告诉您有关更改的信息。