2011-11-16 9 views
7

सहायता के लिए मानक कुंजी संयोजन कमांड - है? मैक पर। मैं इस कुंजी संयोजन को मेनू आइटम में कैसे बांध सकता हूं।आदेश कैसे बाध्य करें-? एक सहायता मेनू के लिए एक स्विंग कार्रवाई त्वरक के रूप में?

नोट: चूंकि हमारे उपयोगकर्ताओं के पास अलग-अलग कीबोर्ड लेआउट हैं, मैं ऐसे समाधान की तलाश में हूं जिसके बारे में ज्ञान की आवश्यकता नहीं है "?" पर स्थित है

KeyStroke.getKeyStroke(String) का उपयोग करके, जो जावाडोक कहता है;

Parses a string and returns a `KeyStroke`. The string must have the following syntax: 

<modifiers>* (<typedID> | <pressedReleasedID>) 

modifiers := shift | control | ctrl | meta | alt | button1 | button2 | button3 
typedID := typed <typedKey> 
typedKey := string of length 1 giving Unicode character. 
pressedReleasedID := (pressed | released) key 
key := KeyEvent key code name, i.e. the name following "VK_". 

मैं इस उदाहरण कोड है:

import javax.swing.*; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 

public class HelpShortcut extends JFrame { 

    public HelpShortcut(){ 
     // A few keystrokes to experiment with 
     //KeyStroke keyStroke = KeyStroke.getKeyStroke("pressed A"); // A simple reference - Works 
     //KeyStroke keyStroke = KeyStroke.getKeyStroke("typed ?");  // Works 
     KeyStroke keyStroke = KeyStroke.getKeyStroke("meta typed ?"); // What we want - Does not work 

     // If we provide an invalid keystroke we get a null back - fail fast 
     if (keyStroke==null) throw new RuntimeException("Invalid keystroke"); 

     // Create a simple menuItem linked to our action with the keystroke as accelerator 
     JMenuItem helpMenuItem = new JMenuItem(new HelpAction()); 
     helpMenuItem.setAccelerator(keyStroke); 

     // Install the menubar with a help menu 
     JMenuBar mainMenu = new JMenuBar(); 
     JMenu helpMenu = new JMenu("Help"); 
     helpMenu.add(helpMenuItem); 
     mainMenu.add(helpMenu); 

     setJMenuBar(mainMenu); 
    } 

    // Scaffolding 
    public static void main(String[] pArgs) { 
     HelpShortcut helpShortcut= new HelpShortcut(); 
     helpShortcut.setLocationRelativeTo(null); 
     helpShortcut.setSize(new Dimension(100, 162)); 
     helpShortcut.setVisible(true); 
    } 

    private class HelpAction extends AbstractAction { 

     public HelpAction() { 
      putValue(Action.NAME,"Help me!"); 

     } 

     @Override 
     public void actionPerformed(final ActionEvent pActionEvent) { 
      JOptionPane.showMessageDialog(HelpShortcut.this,"You should ask StackOverflow!"); 
     } 

    } 
} 
+0

बाकी दुनिया सहायता +1 के लिए एफ 1 का उपयोग करें +1 – mKorbel

+1

यह सच है, लेकिन कमांड-? एप्लिकेशन विशिष्ट सहायता के लिए ओएस एक्स मानक है और उपयोगकर्ता क्या उम्मीद करेंगे - ref http://support.apple.com/kb/ht1343 एक और दिलचस्प मुद्दा यह है कि नए मैक पर डिफ़ॉल्ट रूप से एफ-कुंजी मैप किए गए हैं विशेष कार्य (ध्वनि, चमक इत्यादि) और "एफ 1" आदि नहीं है ताकि यह शॉर्टकट उपयोगकर्ता के बिना कीबोर्ड वरीयताओं में सक्षम किए बिना कुछ भी नहीं करेगा। –

उत्तर

6

अपने कीबोर्ड पर "?" "/" कुंजी से ऊपर है, इसलिए आप "?" टाइप करने के लिए Shift कुंजी का उपयोग करने के बाद भी हैं। तो बंधन ऐसा करने के लिए आप का उपयोग करने की आवश्यकता है:

// KeyStroke keyStroke = KeyStroke.getKeyStroke("meta typed ?"); 
int modifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() 
      + KeyEvent.SHIFT_DOWN_MASK; 
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, modifier); 
+1

मेरे पास एक norwegian कीबोर्ड है, और इस पर प्रश्न "+" कुंजी से ऊपर है (संख्या 0 के बाईं ओर - KeyEvent.VK_PLUS के साथ आपका सुझाया गया कोड कुछ भी नहीं करता है। अगर आप VK_PLUS के साथ कोड आज़माते हैं, तो क्या यह काम करता है आपके लिए (यह अनदेखा कर रहा है "?")। इसके अलावा - मैं कीबोर्ड लेआउट के बारे में जानने से कैसे बच सकता हूं? –

+0

दो कुंजी VK_PLUS और VK_ADD हैं। मेरे कीबोर्ड पर VK_ADD संख्यात्मक कीपैड पर कुंजी है I ऐसा नहीं लगता कि कुंजीपटल लेआउट को जानने के लिए ऐसा करने का एक तरीका है। यह एक कारण है कि एफ 1 का उपयोग करना सुरक्षित है। मुझे नहीं पता कि यह मैक दुनिया में कैसे संभाला जाता है क्योंकि मैंने कभी मैक का उपयोग नहीं किया है – camickr

+0

हां, मुझे यह मैक पर जेआरई का क्विर्क होने का संदेह है और यह कि कामकाज खोजने में मुश्किल हो सकती है, खासकर जब कीबोर्ड लेआउट के बारे में ज्ञान की आवश्यकता होती है। आपके प्रयास के लिए धन्यवाद :-) –

3

(आश्चर्य की बात - मेरे लिए :-) keyIDs की बाइंडिंग के लिए संशोधक "आपके द्वारा लिखा गया" समर्थित नहीं हैं: जब तुम बना सकते हैं और inputMap में इस तरह बाध्य कर सकते हैं, वे कर रहे हैं कभी नहीं मिला क्योंकि टाइप की गई कुंजी के लिए आंतरिक रूप से जेनरेट की गई कुंजीस्ट्रोक कुंजी कुंजी का उपयोग करते हैं और संशोधक को अनदेखा करते हैं। यही कारण है कि निर्माण JComponent.processKeyBindings (...)

boolean processKeyBindings(KeyEvent e, boolean pressed) { 
    if (!SwingUtilities.isValidKeyEventForKeyBindings(e)) { 
     return false; 
    } 
    // Get the KeyStroke 
    KeyStroke ks; 

    if (e.getID() == KeyEvent.KEY_TYPED) { 
     ks = KeyStroke.getKeyStroke(e.getKeyChar()); 
    } 
    else { 
    ks = KeyStroke.getKeyStroke(e.getKeyCode(),e.getModifiers(), 
       (pressed ? false:true)); 
    } 

इसके बारे में सोच रही थी में होता है, मतलब हो सकता है कि: दबाया/जारी की शारीरिक कुंजी संभालती है, जबकि टाइप अंतिम संयुक्त के "उत्पादन" है एक या अधिक भौतिक चांबियाँ। यदि किसी भी दिए गए संयोजन के लिए कोई वैध कुंजीर नहीं है, तो कोई भी कुंजी टाइप नहीं किया गया है।

आधार समस्या स्विंग/एटीटी डेवलपर्स के जाने-माने यूएसए केंद्रवाद है: वे भौतिक कुंजी के रूप में गिने जाते हैं केवल हमारे लेआउट पर ;-) कोई भी तरीका (जिसे मैं जानता हूं) अन्य कुंजियों में प्राप्त करने के लिए लेआउट-अज्ञेयवादी तरीके से। - गलत साबित होने की आशा

+0

धन्यवाद, मुझे जेडीके कोड को देखने का विचार करना चाहिए :) प्रश्न देखने के लिए खुला है कि किसी के पास कोई कामकाज है या नहीं। –

4

KeyEvent API doc देखें अनुभाग नोट:

नहीं सभी पात्रों उनसे जुड़े किसी कीकोड है। उदाहरण के लिए, प्रश्न चिह्न के लिए कोई कीकोड नहीं है क्योंकि प्राथमिक परत पर कोई कीबोर्ड नहीं है जिसके लिए यह दिखाई देता है।

संबंधित मुद्दे

 संबंधित मुद्दे