2009-08-10 18 views
18

मेरे पास संपादन योग्य JComboBox है जहां टेक्स्ट टाइप होने पर मैं कुछ कार्रवाई करना चाहता हूं, या तो टाइपिंग या चयन करके। इस मामले में, पाठ एक पैटर्न है और मैं यह सत्यापित करना चाहता हूं कि पैटर्न मान्य है और उन मैचों को दिखाएं जिनके परिणामस्वरूप कुछ परीक्षण डेटा होते हैं।मुझे कैसे पता चलेगा कि एक संपादन योग्य JComboBox का पाठ बदल दिया गया है?

स्पष्ट करने के बाद, एक एक्शनहैंडलर संलग्न करें, मैंने पाया है कि, टाइपिंग के लिए, घटना अविश्वसनीय रूप से आग लगती है, सर्वोत्तम (चयन ठीक है)। और जब टाइपिंग के परिणामस्वरूप आग लगती है, पाठ पुनर्प्राप्त (getEditor()। GetItem() का उपयोग करके, getSelectedItem() केवल सूची से चयनित होने पर पाठ प्राप्त करता है) जैसा टेक्स्ट था जब आखिरी घटना को निकाल दिया गया - यानी, यह हमेशा गायब हो जाता है कि कार्रवाई घटना को निकाल दिया गया था इससे पहले चरित्र को तुरंत टाइप किया गया था।

मैं कुछ छोटी देरी (500ms से 1 सेकेंड) के बाद कार्रवाई की घटना को आग लगने की उम्मीद कर रहा था, लेकिन ऐसा लगता है कि इसे तुरंत (यदि इसे बिल्कुल निकाल दिया जाता है) पर निकाल दिया जाता है।

केवल एकमात्र व्यावहारिक विकल्प मैं सोच सकता हूं कि फोकस-प्राप्त पर 1 सेकंड टाइमर शुरू करना है, इसे फोकस-खोने पर मारना और समय-समय पर सामग्री अलग होने पर टाइमर एक्शन के रूप में काम करना है।

कोई विचार या सुझाव?

कोड के टुकड़े विशेष रूप से दिलचस्प नहीं हैं:

find.addActionListener(this); 
... 
public void actionPerformed(ActionEvent evt) { 
    System.out.println("Find: "+find.getEditor().getItem()); 
    } 

उत्तर

30

कार्रवाई श्रोता आम तौर पर केवल निकाल दिया जाता है जब आप दर्ज करें, या बता गया के संपादक से दूर ले जाने के लिए ध्यान केंद्रित मारा।

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent(); 
tc.getDocument().addDocumentListener(this); 

DocumentListener interface तरीकों है कि जब भी दस्तावेज़ संपादक समर्थन संशोधित किया गया है (insertUpdate, removeUpdate, changeUpdate) कहा जाता है है: संपादक को अलग-अलग परिवर्तन रोकना सही तरीका एक दस्तावेज श्रोता रजिस्टर करने के लिए है।

final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent(); 
tcA.getDocument().addDocumentListener(new DocumentListener() { 
    ... code that uses comboA ... 
}); 

final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent(); 
tcB.getDocument().addDocumentListener(new DocumentListener() { 
    ... code that uses comboB ... 
}); 
+0

धन्यवाद, मैं इसे आज़मा दूंगा। मुझे पूरी तरह से स्विंग पर कोई फर्क नहीं पड़ता, लेकिन कभी-कभी कुछ व्यवहार या ट्रैफिक कुछ घटनाओं को कैसे प्राप्त करना है, यह स्पष्ट है कि ** FAR ** स्पष्ट है। –

+0

ठीक है, इसलिए विधि कॉल के "1 9" स्तर को अलग करना ... एक दस्तावेज़ श्रोता जोड़ने के बाद, जब घटना होती है तो मुझे दो कॉम्बो-बॉक्स बदलने के लिए कोई रास्ता नहीं मिल सकता है। इस बिंदु पर, एक साधारण टाइमर बल्कि आकर्षक लग रहा है। –

+0

मैंने दो सीबीएस के लिए अंतिम ज्ञात पाठ संग्रहीत किया है, और यह निर्धारित करने के लिए कि दस्तावेज़ ईवेंट को निकाल दिया गया है, यह निर्धारित करने के लिए इसका उपयोग करें। यदि आप जानते हैं कि ईवेंट को वापस उस घटक से कैसे बांधना है जो इसे निकाल देता है जो उपयोगी जानकारी होगी - क्योंकि दस्तावेज़वेन्ट मानक एडब्ल्यूटी ईवेंट या java.util.EventObject नहीं है। –

0

आप इस तरह somthing उपयोग कर सकते हैं:

JComboBox cbListText = new JComboBox(); 
cbListText.addItem("1"); 
cbListText.addItem("2"); 
cbListText.setEditable(true); 
final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent(); 
tfListText.addCaretListener(new CaretListener() { 
    private String lastText; 

    @Override 
    public void caretUpdate(CaretEvent e) { 
     String text = tfListText.getText(); 
     if (!text.equals(lastText)) { 
      lastText = text; 
      // HERE YOU CAN WRITE YOUR CODE 
     } 
    } 
}); 
-1

इस सबसे अच्छा समाधान की तरह लगता है

तुम भी जहां घटनाओं से आ रहे हैं के महीन बेहतर नियंत्रण के लिए एक अनाम वर्ग का उपयोग कर सकते

jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() { 
public void keyReleased(java.awt.event.KeyEvent evt) { //add your hadling code here: 

} }); 
+1

यह कुंजीपटल का उपयोग किये बिना किए गए परिवर्तनों को याद करता है (ई। जी। पॉइंटिंग डिवाइस का उपयोग करके टेक्स्ट पेस्ट करना या हटाना)। – Martin

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