Использовать по умолчанию KeyMap родной ОС - PullRequest
5 голосов
/ 05 декабря 2009

В Java, используя нестандартный внешний вид системы, мы получим другую раскладку клавиатуры.

Например Я использую Mac OS X и использую Substance look and feel (нестандартный внешний вид системы). В результате я теряю свой «мета» ключ для выбора всех текстовых компонентов В Mac OS X должно быть «meta + a», но при использовании Substance мы должны использовать «ctrl + a» (и многое другое, например «следующее слово», «предыдущее слово», «конец строки», «начало строки», так далее) Таким образом, у нас не было ощущения mac os x с использованием нестандартного внешнего вида системы (внешний вид и содержание вещества).

Есть ли способ использовать нестандартный внешний вид системы, но использовать системную (нативную) раскладку клавиатуры?

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

Работа вокруг

Менее элегантное решение, вы можете попробовать добавить ключевой слушатель, чтобы переопределить поведение по умолчанию "ctrl + a", реализовав метод keyPressed (обратите внимание, что в следующем примере не запрещается "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(); 
  }
}

Лучшей альтернативой будет использование inputMaps (см. Комментарий от uudashr ниже).


Мысли о первопричине

К сожалению, как следует из названия класса, внешний вид (или LAF ) является комбинацией внешнего вида, т.е. look , а также "поведением системы", то есть чувствовать . Если вы копаете вокруг источника вещества, SubstanceLookAndFeel переопределяет BasicLookAndFeel , который поставляется с ходом. Похоже, что внутри BasicLookAndFeel нарушающее поведение установлено в initComponentDefaults. Вы должны иметь возможность получить UIDefaults от LAF, вызвав getDefaults ().

Проблемы здесь:

  • «Системные поведения», которые вы хотите изменить, смешаны с настройками внешнего вида, которые вы хотите оставить нетронутыми.
  • Мне также не удалось найти какой-либо простой способ ввести эти значения по умолчанию в вещество на уровне LAF ... У кого-нибудь есть другие идеи по этому поводу?
0 голосов
/ 30 декабря 2009

Одной из возможностей является перевод ключевых событий META в ключевые события CTRL. Поэтому, когда пользователь в OS X нажимает клавишу META, он вместо этого переводится в клавишу CTRL. Это должно работать правильно для сочетаний клавиш, которые имеют только CTRL и META, поменяемые местами между LAF. Если есть другие более сложные комбинации, вы всегда можете выполнить более сложное сопоставление и перевод. Код для базового перевода приведен ниже, я протестировал его с помощью JMenuItem с ключевым ускорителем CTRL + O, поэтому теперь META + O активирует ускоритель.

java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            public void eventDispatched(AWTEvent event) {
                KeyEvent kev = (KeyEvent) event;
                if (kev.getID() == KeyEvent.KEY_PRESSED || kev.getID() == KeyEvent.KEY_RELEASED || kev.getID() == KeyEvent.KEY_PRESSED) {
                    if ((kev.getModifiersEx() & KeyEvent.META_DOWN_MASK) != 0 && !((kev.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0)) {
                        kev.consume(); // Drop the original event, this is really optional.
                        KeyEvent fake = new KeyEvent(kev.getComponent(),
                                kev.getID(),
                                kev.getWhen(),
                                (kev.getModifiersEx() & ~KeyEvent.META_DOWN_MASK) | KeyEvent.CTRL_DOWN_MASK,
                                kev.getKeyCode(), kev.getKeyChar());
                        java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(fake);
                    }
                }
            }
        }, KeyEvent.KEY_EVENT_MASK);

Это устанавливает AWTEventListener в очередь AWTEvent и повлияет на все ключевые события.

...