2011-09-16 28 views
9

पर कुंजी दबाएं मैं जावा के साथ एक एप्लिकेशन बना रहा हूं जिसमें JTextPane है। मैं कुछ कोड निष्पादित करने में सक्षम होना चाहता हूं जब कुंजी दर्ज करें (या जब उपयोगकर्ता अगली पंक्ति में जाता है)। मैंने वेब पर देखा है और समाधान नहीं मिला है। क्या सी # से निपटने के लिए बेहतर होगा? यदि नहीं, तो मैं JTextPane की keyTyped() ईवेंट में एंटर कुंजी कैसे पंजीकृत कर सकता हूं? यदि सी # एक अच्छा विकल्प है, तो मैं इसे सी # में कैसे करूं?जावा: <ENTER> पंजीकृत करें JTextPane

यहाँ एक समाधान मैंने सोचा काम करेगा है ... लेकिन

//Event triggered when a key is typed 
private void keyTyped(java.awt.event.KeyEvent evt) { 
    int key = evt.getKeyCode(); 
    if (key == KeyEvent.VK_ENTER) { 
     Toolkit.getDefaultToolkit().beep(); 
     System.out.println("ENTER pressed"); 
    } 
} 

नहीं था क्यों कि ऊपर के उदाहरण काम नहीं करता मैं करूंगा क्योंकि कोई फर्क नहीं पड़ता जो कुंजी मैं दबाते हैं, तो मैं 0. के किसी कीकोड मिलता है जावा में इस समस्या का समाधान पसंद करते हैं लेकिन सी # भी बेहतर काम करेगा, शायद बेहतर। साथ ही, कृपया उदाहरण के साथ प्रश्न का उत्तर देने का प्रयास करें और लिंक नहीं (जब तक आपको वास्तव में आवश्यकता नहीं है)। धन्यवाद!

+0

न उपयोग keyListeners, keybindings प्रयोग करते हैं के रूप में @Hovercraft getKeyCode() के लिए – kleopatra

+0

Javadocs से सुझाव: 'KEY_TYPED घटनाओं के लिए, कीकोड है VK_UNDEFINED.' यह कम से कम 1.3 के बाद से इस तरह के रूप प्रलेखित किया गया है। [कुंजी बाइंडिंग] के लिए –

उत्तर

13

एक समाधान टेक्स्टपेन पर एक कुंजी बाध्यकारी जोड़ना है। उदाहरण के लिए,

JTextPane textPane = new JTextPane(); 

    int condition = JComponent.WHEN_FOCUSED; 
    InputMap iMap = textPane.getInputMap(condition); 
    ActionMap aMap = textPane.getActionMap(); 

    String enter = "enter"; 
    iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enter); 
    aMap.put(enter, new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("enter pressed"); 
    } 
    }); 
+3

+1 (http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), हालांकि डिफ़ॉल्ट डालने-ब्रेक कार्रवाई खो जाएगी। – trashgod

+2

@trashgod सच है, लेकिन आवश्यकता पूरी तरह स्पष्ट नहीं है, एक हो सकता है) डिफ़ॉल्ट व्यवहार को प्रतिस्थापित करें या बी) डिफ़ॉल्ट व्यवहार में जोड़ें बी) बस डिफ़ॉल्ट को लपेटें और कस्टम – kleopatra

1

इस उत्तर में मामला क्या कभी किसी ने इस सूत्र मैं श्री मोहम्मद Adib के रूप में ही चीज़ें देखता है। तो बजाय (evt.getKeyCode() == evt.VK_ENTER) का उपयोग कर के मैं (evt.getKeyChar() == '\ n')

and the solution worked. 
+0

में ट्रिगर करें अभी भी प्रश्न पर मेरी टिप्पणी है: keyListeners का उपयोग न करें ... कभी भी। उच्च abstraction स्तर पर समाधान हैं, @ trashgod का उत्तर – kleopatra

+0

getKeyCode() के लिए JavaDocs से: 'KEY_TYPED ईवेंट के लिए, कुंजीकोड VK_UNDEFINED है।' इसे कम से कम 1.3 के रूप में दस्तावेज किया गया है। मुझे लगता है कि ओपी ने दस्तावेज़ों को कभी नहीं पढ़ा है। –

0

मैं पासवर्ड में एंटर कुंजी रहा हूँ का उपयोग टेक्स्ट फ़ील्ड, जब एंटर दबाया गया था तो लॉगिन विधि लॉन्च करने के लिए। नीचे दिया गया कोड कंसोल में कुंजीकोड प्रिंट करेगा। बॉक्स में कार्यक्रम में कुछ tihngs चल रहा है और टाइप करने के बाद मैं Enter कुंजी आप देख रहे हैं एक भी कुंजी दबाएँ के लिए यह कोड 13.

txtPass = new Text(shlLogin, SWT.BORDER | SWT.PASSWORD); 
    txtPass.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println(e.keyCode); 
      if (e.keyCode == 13) { /* ... Do your stuff ... */ } 
     } 
    }); 

है, तो आप अभी भी एक छोटे से आलसी हो सकता है और नया सीखने से बच सकते हैं के लिए खोज की इस विधि का उपयोग करके, कुंजी बाइंडिंग के बारे में सामान। CTRL + [पत्र] शॉर्टकट जोड़ते समय मजा शुरू होता है - लेकिन यह एक और चर्चा के लिए है।