2010-01-07 13 views
7

के रूप में फ़ंक्शन कुंजी (F2) सेट करना मेरे पास मेनू आइटम, "नाम बदलें" है, जिसके लिए F2 एक्सेलेरेटर के रूप में सेट किया गया है। दरअसल जब मेनू प्रदर्शित होता है तो "नाम बदलें" के बगल में थोड़ा "एफ 2" संकेत होता है।स्विंग: एक्सेलेरेटर

अफसोस की बात है, यह काम नहीं करता है। यह त्वरक कोई प्रतिक्रिया नहीं ट्रिगर करता है। जब मैं त्वरक को CTRL + F2 में बदलता हूं - यह काम करता है।

ऐसा लगता है कि मुझे एक इंपाउटएमपीए/एक्शनमैप का उपयोग करना चाहिए। इसके साथ समस्या यह है कि मैं इसे ऐप में हर जगह काम करना चाहता हूं, इसलिए मैं इसे शीर्ष-स्तर के जेएफआरएएम से जोड़ने की कोशिश कर रहा हूं। लेकिन, जेएफआरएएम में getInputMap() विधि नहीं है।

खो गया।

[जोड़ा गया]

 ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
    JMenuItem mi = new JMenuItem("Rename"); 
    mi.setAccelerator(ks); 
    mi.addActionListener(action); 
+1

कृपया हमें आप त्वरक स्थापित करने के लिए का उपयोग कोडिंग! –

+3

क्या यह हो सकता है कि आपका ओएस/विंडो मैनेजर कीस्ट्रोक "उपभोग" करता है, इसलिए यह वास्तव में आपके स्विंग एप्लिकेशन पर कभी नहीं आता है (उदाहरण के लिए क्योंकि F2 को किसी विशेष चीज़ से मैप किया गया है, और Ctrl-F2 नहीं है)? – netzwerg

उत्तर

4

यह शायद हो रहा है क्योंकि JTable StartEditing कार्रवाई आह्वान करने के लिए एफ 2 का उपयोग करता है (मैं अपने कार्यक्रमों में से एक पर एक ही व्यवहार को देखा और यह करने के लिए यह पता लगाया)।

कुछ समाधान हैं।

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
while (imap != null) 
{ 
    imap.remove(keyToRemove); 
    imap = imap.getParent(); 
} 

या, आप केवल प्रदर्शन के लिए तालिका का उपयोग कर रहे हैं, और जाने के लिए योजना नहीं है: सबसे कठोर इस इनपुट मैपिंग निकालने के लिए (मेरा मानना ​​है कि इस कोड को वास्तव में सभी JTables से मानचित्रण को हटाता है) है उपयोगकर्ता संपादित यह है, आप इसे गैर फ़ोकस करने योग्य बना सकता है:

table.setFocusable(false); 

एक पूरी तरह से अलग विषय पर, मैं दृढ़ता से अपने मेनू आइटम के लिए एक AbstractAction उपवर्ग बनाने के बजाय, "शून्य से" बनाने का सुझाव देते। आपको बहुत ही सरल मेनू सेटअप कोड देने के अलावा, आप मुख्य मेनू और पॉपअप/टूलबार दोनों के लिए एक ही क्रिया उदाहरण का उपयोग कर सकते हैं, और एक ही समय में उन्हें सक्षम/अक्षम कर सकते हैं।

4

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैंने मूल पोस्टर के समान ही चीज़ के साथ संघर्ष किया और समाधान पाया। JFrame में कोई getInputMap विधि नहीं है, लेकिन इसकी रूट फलक करता है। तो आपको इसके बजाय "getRootPane.getInputMap" का उपयोग करना होगा।

उदाहरण कोड:

public class ApplicationFrame extends JFrame { 
    private AbstractAction f2Action = new AbstractAction() { 
     private static final long serialVersionUID = 1L; 

     public void actionPerformed(ActionEvent e) { 
      // Do something useful 
     } 
    }; 

    public ApplicationFrame() { 

     InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getRootPane().getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action"); 
     actionMap.put("f2Action", f2Action); 

    } 
} 
+1

हम्म .. ऐसा नहीं लगता कि यह बाध्यकारी काम करेगा जब मेनू त्वरक नहीं करता है। – kleopatra

+0

त्वरक एक बाध्यकारी है जिसे कहीं भी जोड़ा जाता है। समस्या यह है कि घटक पेड़ के साथ कुछ बाध्यकारी तक पहुंचने से पहले कीस्ट्रोक को कैप्चर कर रहा है। मैंने इसे एक विधि लिखकर हल किया जो पूरे कंटेनर पेड़ को पार करता है और किसी भी जेकंपोनेंट के इनपुट मैप से कीस्ट्रोक को हटा देता है। –