2011-09-07 12 views
7

के साथ क्रियाओं का उपयोग करके मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां मैं किसी JTextArea की सामग्री को अद्यतन करने वाले उपयोगकर्ता द्वारा मैन्युअल रूप से कुछ ट्रिगर करना चाहता हूं, या मैन्युअल रूप से जेबटन दबाकर।दस्तावेज़ लिस्टनर

मैंने दस्तावेज़ लिस्टनर का उपयोग करके पहला भाग किया है और प्रासंगिक कोड को insertUpdate विधि में डाल दिया है।

मैंने Action एस पहले उपयोग नहीं किया है, लेकिन मैंने सुना है कि वे उन परिस्थितियों के लिए उपयोगी हैं जहां आपको कई नियंत्रणों से ट्रिगर करने की आवश्यकता है। क्या दस्तावेज़ लिस्टनर से कार्रवाई को ट्रिगर करना संभव है? क्या क्रियाओं का उपयोग करना एक अच्छा विचार है, या क्या मुझे अपना कोड सामान्य विधि में रखना चाहिए?

(निर्माता में):

textAreaInput.getDocument().addDocumentListener(new DocumentListener() { 
     public void insertUpdate(DocumentEvent e) { 
      // do something 
     } 
     public void removeUpdate(DocumentEvent e) {} 
     public void changedUpdate(DocumentEvent e) {} 
    }); 

और कार्रवाई है, जो एक क्षेत्र है:

Action doSomething = new AbstractAction("Do Something!") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // do it 
    } 
}; 

स्पष्टीकरण:

JTextArea पाठ कि में चिपकाया जाता है प्राप्त होगा उपयोगकर्ता द्वारा, जिसे मैं स्वचालित रूप से पार्स करना चाहता हूं। पार्सिंग जीयूआई में कहीं और सेट अन्य मूल्यों पर निर्भर करता है; यदि उपयोगकर्ता इन अन्य मानों को बदलता है, तो वह पाठ को दोबारा जोड़ना चाह सकता है, इसलिए बटन दबाकर एक ही कार्रवाई करने की आवश्यकता है।

उत्तर

3

आप actionPerformed() विधि का आह्वान कर सकते हैं, चाहे वह Action में हो या नहीं। एक उदाहरण here है।

+0

'एक्शन' के फायदे आम तौर पर उल्लिखित मामूली ओवरहेड से अधिक हैं, जैसा कि यहां बताया गया है [http://stackoverflow.com/questions/7253712/java-swing-using-actionmap/7255711#7255711)। – trashgod

+0

आपका मतलब है कि insertDdate विधि में 'doSomething.actionPerformed (new ActionEvent (???)) 'जैसे कुछ जोड़ें? –

+0

हां; लेकिन, @camickr नोट्स के रूप में, आपको यह तय करना होगा कि ऐसा करना समझ में आता है या नहीं। सिर्फ एक सामान्य विधि क्यों नहीं बुलाओ? – trashgod

4

मैं उपयोगकर्ता द्वारा JTextArea की सामग्री को अपडेट करने या मैन्युअल रूप से जेबटन दबाकर कुछ ट्रिगर करना चाहता हूं।

यह मुझे समझ में नहीं आता है।

एक बटन पर क्लिक करने से एक टेक्स्ट एक्शन टेक्स्ट के रूप में एक ही क्रिया को उसी क्षेत्र में क्यों क्लिक किया जाएगा?

मैंने पहले क्रिया उपयोग नहीं किया है, लेकिन मैंने सुना है वे स्थितियों में, जहां आप एक से अधिक नियंत्रण

यही बयान नियंत्रण के लिए है द्वारा ट्रिगर किया जा करने के लिए कुछ की जरूरत के लिए उपयोगी हैं कि उपयोगकर्ता क्लिक करता है , JMenuItems, JButtons की तरह या एक टेक्स्ट फ़ील्ड पर एंटर मारना। आम तौर पर जब आप एक्शनलिस्टर का उपयोग करते हैं तो उनका उपयोग किया जा सकता है।

एक दस्तावेज़ लिस्टर एक एक्शनलिस्टर नहीं है, जैसा कि मैंने पहले कहा था कि किसी क्रिया का उपयोग उचित नहीं लगता है।

मुझे लगता है कि आपको अपनी आवश्यकता को स्पष्ट करने की आवश्यकता है।

संपादित करें, स्पष्टीकरण

उपयोगकर्ता इन अन्य मूल्यों को परिवर्तित करता है के आधार पर, वह पाठ

फिर से पार्स करने के लिए चाहते हो सकता है क्यों उपयोगकर्ता एक विकल्प है? यदि आप टेक्स्ट, टेक्स्ट, फोरग्राउंड, टेक्स्ट एरिया की पृष्ठभूमि बदलते हैं, तो यह घटक स्वचालित रूप से पुनर्निर्मित करता है, आपको इसे करने के लिए नहीं पूछना पड़ता है।यदि आप इन तरीकों के लिए कोड देखते हैं तो वे हमेशा पुनर्मूल्यांकन() और repaint() विधियों का आह्वान करते हैं।

पार्सिंग अन्य मूल्यों पर निर्भर करता है जो जीयूआई में कहीं और सेट होते हैं;

लगता है जैसे आपको कस्टम कक्षा की आवश्यकता है। शायद एक पार्सडटेक्स्ट एरिया या पार्सड डॉक्यूमेंट। इस वर्ग में "गुण" होंगे जिन्हें जीयूआई में कहीं और सेट किया जा सकता है। यह दस्तावेज़ लिस्टनर को प्रत्यारोपित करेगा। यह आपके "parseTheText" विधि का भी समर्थन करेगा। इसलिए जब भी कोई संपत्ति बदल जाती है या दस्तावेज़वेन्ट उत्पन्न होता है तो आप स्वचालित रूप से "parseTheText" विधि को बुलाते हैं। इस तरह आपको एक अलग बटन की आवश्यकता नहीं है और घटक हमेशा समन्वयित होगा क्योंकि पार्सिंग स्वचालित है।

+0

मैंने ऊपर अपनी आवश्यकता पर कुछ स्पष्टीकरण जोड़ा है। मैं गलत समझ सकता हूं कि कार्रवाइयां क्या हैं, इसलिए शायद आप सही हैं और वे यहां उचित नहीं हैं। –

+0

अच्छी रूपरेखा :-) केवल नाइटपिकिंग - सिवाय इसके कि अधिकतर कस्टम क्लास बटन दस्तावेज़ की आवश्यकता पर सवाल उठाने के लिए दस्तावेज़ लिस्टनर (लेकिन एक का उपयोग करें) को _implement_ नहीं करेगा और न ही दस्तावेज़/टेक्स्टकंपोनेंट – kleopatra

+0

+1 का विस्तार करेगा। – trashgod

2

मुझे लगता है कि आपको एक्शन ऑब्जेक्ट बनाने की आवश्यकता नहीं है। आप बटन के लिए ActionListener जोड़ सकते हैं जैसे आपने इनपुट के दस्तावेज़ में DocumentListener जोड़ा है। मैं सही ढंग से आपकी समस्या को समझते हैं, तो आप इस तरह कुछ करना चाहिए हो सकता है:

textInput.getDocument().addDocumentListener(new DocumentListener(){    
    @Override 
    public void insertUpdate(DocumentEvent e) { 
     doIt(); 
    }    
    @Override 
    public void removeUpdate(DocumentEvent e) {}     
    @Override 
    public void changedUpdate(DocumentEvent e) {} 
}); 

button.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     doIt(); 
    } 
}); 

doIt() एक विधि है जिसमें आप है कि आप क्या करना चाहते थे क्या करेंगे है।

+0

उम्मीद है कि कुछ विशेषज्ञ मेरी पोस्ट पर कुछ सिफारिश जोड़ देंगे। – Mohayemin

+0

आपको जो भी कहा गया है, उसे प्राप्त करें :-) -1 एक्शनलिस्टर पर कार्रवाई के पक्ष में पक्षपात करने के लिए (नियम है: सामान्य विधि – kleopatra

+0

@ क्लेओपेट्रा के लिए +1 सबसे उच्च अमूर्तता हमेशा उपलब्ध है)। मैंने वास्तव में कभी भी कार्रवाई का उपयोग नहीं किया। मैंने आपकी प्रोफ़ाइल का दौरा किया और मैं मानता हूं कि मैंने जो कुछ पूछा है उसे मिला है :)। – Mohayemin

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