2010-05-07 14 views
8
DocumentListener dl = new MessageDocumentListener(); 
((AbstractDocument) nboxArea.getDocument()).setDocumentFilter(new DocumentFilter() { 
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
     string = string.replaceAll("\t", ""); 
     super.insertString(fb, offset, string,(javax.swing.text.AttributeSet) attr); 
    } 

    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
     text = text.replaceAll("\t", ""); 
     //TODO must do something here 
     super.replace(fb, offset, length, text,(javax.swing.text.AttributeSet) attrs); 
    } 
}); 

JTextArea evArea = (JTextArea) c; 
evArea.getDocument().removeDocumentListener(dl); 
evArea.setText(originalMessage); 

इस मामले में मुझे टेक्स्टरेरा में सेट टेक्स्ट के दौरान निम्न त्रुटि मिली। मुझे नहीं पता कि कैसे हल करें।java.lang.IllegalStateException टेक्स्टएरिया में दस्तावेज़ श्रोता का उपयोग करते समय, जावा

Exception in thread "AWT-EventQueue-0" 
java.lang.IllegalStateException: Attempt to mutate in notification 

मुझे लगता है कि समस्या दस्तावेज़ में पाठ सेट करना या दस्तावेज़ श्रोता में दस्तावेज़ सेट करना है। लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए। कृपया इस मुद्दे को हल करने में मेरी मदद करें।

उत्तर

9

आप दस्तावेज़सूची के अंदर दस्तावेज़ को संशोधित नहीं कर सकते हैं। इसके बजाय एक कस्टम दस्तावेज़ लिखें, जो insertString() या निकालें() विधियों को ओवरराइड करता है।

जावा ट्यूटोरियल से: How to write a DocumentListener

दस्तावेज़ श्रोताओं दस्तावेज़ की सामग्री को संशोधित नहीं होनी चाहिए; श्रोता को परिवर्तन की अधिसूचना के समय तक परिवर्तन पहले ही पूरा हो चुका है। इसके बजाय, एक कस्टम दस्तावेज़ लिखें जो insertString को ओवरराइड करता है या विधियों को हटाता है, या दोनों। विवरण के लिए Listening for Changes on a Document देखें।

3

यदि आप श्रोता में उत्परिवर्तन करना चाहते हैं तो आप इसे स्विंगउटीसिटीज.वोकलेटर के साथ बाद में करने के लिए एक अलग थ्रेड लॉन्च कर सकते हैं। सावधान रहें क्योंकि अलग थ्रेड से संशोधनों को श्रोता को फिर से कॉल किया जाएगा, इसलिए थ्रेड लॉन्च करने से पहले एक बूलियन सेट करें, श्रोता से तत्काल वापस लौटें और सेट किए जाने पर इसे अलग थ्रेड में संशोधित करने के बाद रीसेट करें।

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