使用本机操作系统的默认KeyMap

uud*_*shr 5 java swing keymapping look-and-feel

在Java中,通过使用非默认系统外观我们将有不同的keymap.

例如,我正在使用Mac OS X并使用Substance外观(非默认系统外观).效果是我放弃了我的"meta"键,用于选择所有文本组件在mac os x中应该是"meta + a",但是使用Substance我们必须使用"ctrl + a"(以及更多诸如"下一个单词","prev word","end line,"begin line"等)所以我们没有使用非默认系统外观(物质外观)的mac os x感觉.

有没有办法使用非默认系统外观,但使用系统(本机)键映射?

Cli*_*ton 1

解决办法

一个不太优雅的解决方案,您可以尝试添加一个按键监听器,通过实现 keyPressed 方法来覆盖默认的“ctrl + a”行为(请注意,以下示例并不禁止“ctrl + a”,只是添加了对“meta + a”的支持”):

@Override
public void keyPressed(final KeyEvent e) {
  // Get the default toolkit shortcut mask ("meta" for OSX).
  int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();

  // You could also check modifiers against KeyEvent.META_MASK...
  if (e.getModifiers() == keyMask && e.getKeyCode() == KeyEvent.VK_A) {
    // Select everything (assumes member of child text component class).
    this.selectAll();

    // We handled this keystroke, 'a' will be ignored by underlying text component.
    e.consume(); 
  }
}
Run Code Online (Sandbox Code Playgroud)

更好的选择是使用 inputMaps(请参阅下面 uudashr 的评论)。


对根本原因的思考

不幸的是,正如类名所暗示的,外观(或LAF )是外观(即外观)以及“系统行为”(即感觉)的组合。如果您挖掘物质源,SubstanceLookAndFeel会覆盖swing 附带的BasicLookAndFeel 。看起来好像在 BasicLookAndFeel 中,违规行为是在 initComponentDefaults 中设置的。您应该能够通过调用 getDefaults() 从 LAF 获取 UIDefaults。

这里的问题是:

  • 您希望更改的“系统行为”与您希望保持不变的外观设置混合在一起。
  • 我也无法找到任何简单的方法将这些默认值注入到 LAF 级别的实质内容中......有人对此有其他想法吗?