2011-03-07 10 views
14

उत्पन्न यह जो oject एक DocumentEvent उत्पन्न की खोज के लिए संभव है लगता है? कुछ की तरह मैं ActionListener के साथ क्या कर सकते हैं:कैसे स्रोत घटक है कि एक DocumentEvent

JTextField field = new JTextField(""); 
field.addActionListener(actionListener); 

//inside ActionListener 
public void actionPerformed(ActionEvent arg0) { 
    if (arg0.getSource() instanceof JTextField) //true 

} 

मैं DocumentEvent साथ भी ऐसा ही चाहते हैं, लेकिन एक ही तरीके से काम करने के लिए नहीं लगता है:

JTextField field = new JTextField(""); 
field.getDocument.addDocumentListener(documentListener); 
//inside documentListener 
public void insertUpdate(DocumentEvent){ 
    if (arg0.getSource() instanceof JTextField) //false: class is javax.swing.text.PlainDocument 
    if (arg0.getSource() instanceof MyComponent){ 
     MyComponent comp = (MyComponent)arg0.getSource(); 
     comp.callSpecificMethodUponMyComp(); 
    } 
} 

answser निम्नलिखित बातों को ध्यान में रखना चाहिए:

  1. घटना के उत्पन्न होने वाले ऑब्जेक्ट प्रकार को जानने के मेरे उद्देश्यों के लिए पर्याप्त नहीं है, लेकिन मुझे रनटाइम पर इसके संदर्भ की आवश्यकता है।
  2. आमतौर पर घटनाओं स्विंग वस्तु (myComp सार्वजनिक JTextField) के विस्तार से उत्पन्न होते हैं। इन वस्तुओं में अतिरिक्त जानकारी है कि श्रोता विधि (ते। InsertUpdate)
  3. DocumentListener एक वर्ग है कि क्षेत्रों है कि घटनाओं उत्पन्न होने की जानकारी नहीं से कार्यान्वित किया जाता है के अंदर क्रम को पुनः देखा जाना चाहिए की दुकान। विभिन्न प्रकार के विभिन्न क्षेत्रों रनटाइम पर श्रोता के लिए attacched जा सकता है।

उत्तर

26

आप दस्तावेज़ में एक संपत्ति सेट कर सकते हैं आपको बताने के लिए जो textcomponent दस्तावेज़ अंतर्गत आता है करने के लिए:

उदाहरण के लिए:

final JTextField field = new JTextField(""); 
field.getDocument().putProperty("owner", field); //set the owner 

final JTextField field2 = new JTextField(""); 
field2.getDocument().putProperty("owner", field2); //set the owner 

DocumentListener documentListener = new DocumentListener() { 

    public void changedUpdate(DocumentEvent documentEvent) {} 

    public void insertUpdate(DocumentEvent documentEvent) { 

     //get the owner of this document 
     Object owner = documentEvent.getDocument().getProperty("owner"); 
     if(owner != null){ 
      //owner is the jtextfield 
      System.out.println(owner); 
     } 
    } 

    public void removeUpdate(DocumentEvent documentEvent) {} 

    private void updateValue(DocumentEvent documentEvent) {} 
}; 

field.getDocument().addDocumentListener(documentListener); 
field2.getDocument().addDocumentListener(documentListener); 

वैकल्पिक रूप से:

दस्तावेज़ प्राप्त करें कि घटना को प्रस्तुत किया और इसे टेक्स्टफील्ड के दस्तावेज़ से तुलना करें।

उदाहरण:

public void insertUpdate(DocumentEvent documentEvent) { 
    if (documentEvent.getDocument()== field.getDocument()){ 
     System.out.println("event caused by field"); 
    } 
    else if (documentEvent.getDocument()== field2.getDocument()){ 
     System.out.println("event caused by field2"); 
    } 
} 
+0

आपके उत्तर के लिए धन्यवाद। काफी उपयोगी लेकिन यह मेरे डिजाइन के लिए पर्याप्त नहीं है। मैंने अपने प्रश्नों को बेहतर तरीके से समझाने की कोशिश की जो मेरी ज़रूरतें हैं – Heisenbug

+2

इस उत्तर का पहला संस्करण, जो 'मालिक' संपत्ति सेट करता है, सवाल के साथ पूरी तरह फिट होना प्रतीत होता है (कूल टिप बीटीडब्ल्यू, मुझे इसके बारे में पता नहीं था!)। क्या आप अधिक विशेष रूप से समझा सकते हैं कि यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है? –

+0

@Jesse Barnum: मुझे लगता है कि आप सही कर रहे हैं। असल में मैंने कुत्ते के पहले जवाब को गलत समझा है जो सही था। असल में यदि मैं माइक्रॉम्पोनेंट प्रकार का प्रत्यक्ष संदर्भ चाहता हूं तो मैं फ़ील्ड.पुटप्रॉपर्टी ("मायकंपोनेंट", anInstanceOfMyComponent) जैसे कुछ कर सकता हूं, है ना? (मैं अब थोड़ा बेवकूफ महसूस कर रहा हूं :(, शायद इन दिनों कोड की लाइनों ने मुझे भ्रमित कर दिया) – Heisenbug

3

के बजाय एक ही श्रोता के लिए एक से अधिक फ़ील्ड जोड़ें। एक कस्टम श्रोता बनाएं जो सृजन पर टेक्स्ट फ़ील्ड का संदर्भ लेता है। फिर जब भी आप इसे किसी फ़ील्ड में जोड़ते हैं तो श्रोता का एक नया उदाहरण बनाएं।

+0

हाँ .. शायद एक अच्छा समाधान धन्यवाद। लेकिन मेरे श्रोताओं बहुत हैं और वे काफी बड़ी वस्तुएं हैं .. कई उदाहरण हैं वे एक अच्छा विचार नहीं हो सकता है। – Heisenbug

+0

आप अपने श्रोताओं को अपनी कक्षा में तोड़ सकते हैं जो बड़ी वस्तु को कॉल करता है। – jzd

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