2009-12-05 3 views
5

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

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

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

ответ

1

Обходной

менее элегантное решение, вы можете попробовать добавление ключевого прослушивателя для переопределения поведения по умолчанию «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) представляет собой сочетание внешнего вида т.е. вида, а также «система поведение ", т.е. feel. Если вы копаете источник вещества, SubstanceLookAndFeel переопределяет BasicLookAndFeel, который поставляется с качелями. Похоже, что он находится в пределах BasicLookAndFeel, поведение неполадки установлено в initComponentDefaults. Вы должны иметь возможность получить UIDefaults из LAF, вызвав getDefaults().

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

  • «Системные поведения», которые Вы хотите изменить перемешаны с настройками внешнего вида вы хотите оставить нетронутыми.
  • Я также не смог найти какой-либо простой способ ввести эти значения по умолчанию в содержание на уровне LAF ... Кто-нибудь с другими идеями?
+1

Нет, это не изящное решение. Я могу сделать что-то вроде (может быть более элегантным): InputMap inputMap = textComponent.getInputMap(); inputMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK), «none»); inputMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), DefaultEditorKit.selectAllAction); «none» отключит значение по умолчанию ctrl + a. Но это не то, что я хочу. Зачем? Потому что я должен знать все поведение mac os x. Если есть способ, как получить поведение системы и установить ее на новый внешний вид, и это будет здорово. – uudashr

+0

+1 Для вашего комментария у вас есть более элегантная работа. См. Отредактированный ответ на некоторые другие идеи о первопричине ... – Clinton

0

Одна из возможностей - перевести события ключевых событий 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, и затронет все ключевые события.