2012-03-20 16 views
5

के साथ मैक कीबोर्ड शॉर्टकट्स क्या ओएस एक्स पर निंबस एलएएफ (देखो और महसूस) का उपयोग करने का कोई तरीका है जबकि अभी भी मेटा कट/प्रतिलिपि/पेस्ट के लिए कुंजी का चयन करने और सभी परिचालनों का चयन करने में सक्षम है?निंबस एलएएफ

मैं वर्तमान में मेरे स्विंग एप्लिकेशन की मुख्य विधि है, जो ऑपरेटिंग सिस्टम (अन्य सभी के लिए ओएस एक्स निम्बस के लिए डिफ़ॉल्ट) के आधार पर एलएएफ अप में परिवर्तन में निम्नलिखित कोड है:

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

मैं के रूप में यह कर एक समाधान क्योंकि निम्बस कटौती/कॉपी/पेस्ट और चयन सभी ओएस एक्स पर (मेटा कुंजी बनाम Ctrl कुंजी) के लिए कीबोर्ड शॉर्टकट ओवरराइड करता है। मैं हर समय निंबस का उपयोग करना पसंद करूंगा, अगर केवल कीबोर्ड शॉर्टकट ओवरराइड नहीं किए गए थे।

उत्तर

3

getMenuShortcutKeyMask() पद्धति का उपयोग के रूप में इस example में दिखाया गया है, कुंजी सक्षम करने के लिए NimbusLookAndFeel साथ काम करता है। यह संबंधित answer भी देखें।

JTextField के विशेष मामले में, आप key binding में मुखौटा का उपयोग कर सकते हैं जो मूल क्रिया को उजागर करता है।

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

मैं यह कैसे सवाल का जवाब नहीं दिख रहा। यहां तक ​​कि अगर आप getMenuShortcutKeyMask() फोन जब कस्टम कीबोर्ड शॉर्टकट दर्ज की, यह जब पर OSX NimbusLookAndFeel का उपयोग करके डिफ़ॉल्ट स्विंग TextField में गलत Ctrl-C, Ctrl-V, आदि का समाधान नहीं होता। – yonran

+0

@yonran: मैं ऊपर सविस्तार गए हैं। – trashgod

+0

लगता है कि कार्रवाई के नाम घटक प्रति भिन्न होते हैं। तो "कॉपी" कार्रवाई को मैप करने के लिए, आपको DefaultEditorKit.copyAction को मानचित्र करने की भी आवश्यकता होगी। –

1

विभिन्न घटक अलग-अलग कुंजी का उपयोग करते हैं, इसलिए उन सभी को मैप करने के लिए, आपको विभिन्न कुंजी परिभाषित करना होगा। उदाहरण (आधार 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"); 
} 

यह तो विभिन्न घटकों के लिए मैप किया जा सकता इस प्रकार है:

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

एक्वा (ओएस एक्स देखो और महसूस) कार्रवाई नामों की पूरी सूची here है

+0

स्रोत लिंक के लिए Kudos शामिल है! – trashgod

+0

धन्यवाद। एक स्पष्ट उदाहरण खोजने के लिए मुझे थोड़ी देर लग गई, इसलिए मैं इसे अपने साथ जोड़ना चाहता था - मेरे अपने जोड़ों के साथ। –