2013-03-04 8 views
8

मेरा लक्ष्य उपयोगकर्ता द्वारा जेटीक्स्टपेन में लिखे गए कीवर्ड के नीले रंग के रंग को लागू करना है।'अधिसूचना को म्यूटेट करने का प्रयास' अपवाद

private class DocumentHandler implements DocumentListener { 

     @Override 
     public void changedUpdate(DocumentEvent ev) { 
     } 

     @Override 
     public void insertUpdate(DocumentEvent ev) { 
      highlight(); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent ev) { 
      highlight(); 
     } 

     private void highlight() { 
      String code = codePane.getText(); 
      SimpleAttributeSet defSet = new SimpleAttributeSet(); 
      StyleConstants.setForeground(defSet, Color.BLACK); 
      doc.setCharacterAttributes(0, code.length(), defSet, true); 
      SimpleAttributeSet set = new SimpleAttributeSet(); 
      StyleConstants.setForeground(set, Color.BLUE); 
      for (String keyword : keywords) { 
       Pattern pattern = Pattern.compile(keyword + "(\\[\\])*"); 
       Matcher matcher = pattern.matcher(code); 
       while (matcher.find()) { 

        //Just for test 
        System.out.print("Start index: " + matcher.start()); 
        System.out.print(" End index: " + matcher.end()); 
        System.out.println(" Found: " + matcher.group()); 

        doc.setCharacterAttributes(matcher.start(), keyword.length(), set, true); 
       } 
      } 
     } 
    } 

फलक में कुछ भी टाइप करने के बाद मैं:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification 
    at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338) 
    at javax.swing.text.DefaultStyledDocument.setCharacterAttributes(DefaultStyledDocument.java:500) 
    at jnotepad.MainPanel$DocumentHandler.highlight(MainPanel.java:121) 
    at jnotepad.MainPanel$DocumentHandler.insertUpdate(MainPanel.java:108) 
    at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:202) 
    at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:749) 

कैसे मेरी समस्या को हल करने इस तरह की तरह मेरे कोड नज़र है? शायद मुझे DocumentListener के अलावा कुछ और उपयोग करना चाहिए?

उत्तर

14

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

private void highlight() { 

    Runnable doHighlight = new Runnable() { 
     @Override 
     public void run() { 
      // your highlight code 
     } 
    };  
    SwingUtilities.invokeLater(doHighlight); 
} 
+4

मुद्दा नहीं है कि 'प्रकाश डाला()' गलत धागे से क्रियान्वित किया जाता है। इसके बजाय, 'invokeLater (Runnable)' समस्या हल करता है क्योंकि यह दस्तावेज़ लॉक जारी होने तक निष्पादन स्थगित करता है। –

0

मैं एक ही समस्या थी,:

इस प्रयास करें

expiration_timeTF.getDocument().addDocumentListener(
      new DocumentListener() { 
       @Override 
       public void removeUpdate(DocumentEvent e) { 
        System.out.println("remove"); 
       } 

       private void assistDateText() { 
        Runnable doAssist = new Runnable() { 
         @Override 
         public void run() { 
          // when input "2013",will add to "2013-";when 
          // input "2013-10",will add to "2013-10-" 
          String input = expiration_timeTF.getText(); 
          if (input.matches("^[0-9]{4}")) { 
           expiration_timeTF.setText(input + "-"); 
          } else if (input.matches("^[0-9]{4}-[0-9]{2}")) { 
           expiration_timeTF.setText(input + "-"); 
          } 
         } 
        }; 
        SwingUtilities.invokeLater(doAssist); 
       } 

       @Override 
       public void insertUpdate(DocumentEvent e) { 
        // System.out.println("insert"); 
        assistDateText(); 
       } 

       @Override 
       public void changedUpdate(DocumentEvent e) { 
        // System.out.println("change"); 
       } 
      }); 
संबंधित मुद्दे