Сочетания клавиш Mac с Nimbus LAF

Есть ли способ использовать Nimbus LAF (Look And Feel) в OS X, сохраняя при этом возможность использовать клавишу Meta для операций вырезания / копирования / вставки и выделения всего?

В настоящее время у меня есть следующий код в основном методе моего приложения Swing, который изменяет LAF в зависимости от операционной системы (по умолчанию для OS X, Nimbus для всех остальных):

if (!System.getProperty("os.name", "").startsWith("Mac OS X")) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
}

Я делаю это как обходной путь, потому что Nimbus переопределяет сочетания клавиш для вырезания / копирования / вставки и выбора всего в OS X (клавиша Meta вместо клавиши Ctrl). Я бы предпочел использовать Nimbus все время, если бы только сочетания клавиш не были отменены.


person sworisbreathing    schedule 20.03.2012    source источник


Ответы (2)


Использование _1 _ работает с NimbusLookAndFeel, чтобы включить клавишу , как показано в этом примере. См. Также соответствующий ответ.

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

int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
JTextField jtf = new JTextField("Test");
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, MASK), "select-all");
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK), "copy");
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_X, MASK), "cut");
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, MASK), "paste");
person trashgod    schedule 20.03.2012
comment
Я не понимаю, как это отвечает на вопрос. Даже если вы вызываете getMenuShortcutKeyMask () при регистрации пользовательских сочетаний клавиш, это не исправляет неправильные Ctrl-C, Ctrl-V и т. Д. В текстовом поле Swing по умолчанию при использовании NimbusLookAndFeel в OSX. - person yonran; 12.05.2015
comment
@yonran: Я уточнил выше. - person trashgod; 13.05.2015
comment
Кажется, что названия действий различаются для разных компонентов. Итак, чтобы сопоставить действие копирования, вам также необходимо сопоставить DefaultEditorKit.copyAction. - person Jouni Aro; 22.08.2017
comment
@JouniAro: Не обязательно; действия уже находятся в текстовом поле ActionMap, помещенном туда (по имени) во время инициализации делегата пользовательского интерфейса; см. эту статью. - person trashgod; 22.08.2017
comment
Извините, я имею в виду по типу компонента. Таким образом, для каждой таблицы ActionMap содержит копию, тогда как для каждого TextField она содержит копию в буфер обмена (= DefaultEditorKit.copyAction) - person Jouni Aro; 22.08.2017

В разных компонентах используются разные ключи, поэтому для их сопоставления вам нужно будет определить разные ключи. Например (база найдена из здесь):

private void addOSXKeyStrokes(InputMap inputMap) {
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction);
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.META_DOWN_MASK), DefaultEditorKit.cutAction);
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), DefaultEditorKit.pasteAction);
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), DefaultEditorKit.selectAllAction);
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy");
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), "selectAll");
}

Затем это можно сопоставить с различными компонентами следующим образом:

// This must be performed immediately after the LaF has been set
if (System.getProperty("os.name", "").startsWith("Mac OS X")) {
  // Ensure OSX key bindings are used for copy, paste etc
  // Use the Nimbus keys and ensure this occurs before any component creation
  addOSXKeyStrokes((InputMap) UIManager.get("EditorPane.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("FormattedTextField.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("PasswordField.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("TextField.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("TextPane.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("TextArea.focusInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("Table.ancestorInputMap"));
  addOSXKeyStrokes((InputMap) UIManager.get("Tree.focusInputMap"));
}

Полный список имен действий Aqua (OS X Look and Feel): здесь

person Jouni Aro    schedule 22.08.2017
comment
Престижность за ссылку на источник! - person trashgod; 22.08.2017
comment
Спасибо. Мне потребовалось довольно много времени, чтобы найти наглядный пример, поэтому я хотел поделиться им и здесь - с моими собственными дополнениями. - person Jouni Aro; 22.08.2017