2012-03-20 29 views
5

¿Hay alguna forma de usar Nimbus LAF (Look And Feel) en OS X mientras se puede usar la clave Meta para cortar/copiar/pegar y seleccionar-todas las operaciones?Atajos de teclado de Mac con Nimbus LAF

que actualmente tiene el siguiente código en el método principal de mi aplicación Swing, que cambia la LAF basado en el sistema operativo (por defecto para OS X, Nimbus para todos los demás):

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); 
    } 
} 

Lo hago como una solución porque Nimbus sobrescribe los métodos abreviados de teclado para cortar/copiar/pegar y seleccionar todo en OS X (clave Meta frente a tecla Ctrl). Preferiría usar Nimbus todo el tiempo, si solo los accesos directos de teclado no se anularan.

Respuesta

3

Utilizando el método getMenuShortcutKeyMask() trabaja con NimbusLookAndFeel para permitir la tecla ⌘ , como se muestra en este example. Ver también este relacionado answer.

En el caso particular de JTextField, puede usar la máscara en un key binding que evoca la acción original.

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"); 
+0

No veo cómo responde esto a la pregunta. Incluso si llama a getMenuShortcutKeyMask() al registrar accesos directos de teclado personalizados, esto no soluciona el uso incorrecto de Ctrl-C, Ctrl-V, etc. en un Swing TextField predeterminado cuando usa NimbusLookAndFeel en OSX. – yonran

+0

@yonran: He elaborado más arriba. – trashgod

+0

Parece que los nombres de las acciones difieren por componente. Por lo tanto, para asignar la acción de "copia", también deberá asignar DefaultEditorKit.copyAction. –

1

Los diferentes componentes utilizan teclas diferentes, por lo tanto, para asignarlas, tendrá que definir diferentes teclas. Por ejemplo (base encontrado de here):

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"); 
} 

Esto entonces se puede asignar a diferentes componentes como sigue:

// 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")); 
} 

Una lista completa de Aqua (OS X Look and Feel) nombres de acción se here

+0

Felicitaciones por el enlace de origen. – trashgod

+0

Gracias. Me llevó bastante tiempo encontrar un claro ejemplo, así que quería compartirlo aquí también, con mis propias adiciones. –

Cuestiones relacionadas