2013-03-09 72 views
1

我想在JEditorPane的overriden DefaultStyledDocument(也提供自定義EditorKit)中插入一個LeafElement:但是我得到了一個javax.swing.text.StateInvariantError。 因此,遵循JGuru forum topic的指導原則,我添加了writeLock()和writeUnlock()調用,但是這次我的JEditorPane保持爲空。那麼,我應該如何重寫AbstractDocument的fireXXX()方法,以便通知文檔的所有偵聽器?自己插入LeafElement

這裏我的主類:MyFrame.java

import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 


public class MyFrame extends JFrame { 

    public MyFrame(){ 
     setSize(400, 300); 
     JEditorPane editorPane = new JEditorPane(); 
     editorPane.setEditorKit(new MyEditorKit()); 
     add(new JScrollPane(editorPane)); 
    } 

    public static void main(String[] args) { 
     new MyFrame().setVisible(true); 
    } 

    private static final long serialVersionUID = -2122161377842820073L; 

} 

這裏我班MyEditorKit.java

import javax.swing.text.Document; 
import javax.swing.text.StyledEditorKit; 


public class MyEditorKit extends StyledEditorKit { 

    @Override 
    public Document createDefaultDocument() { 
     return new MyDocument(); 
    } 

    private static final long serialVersionUID = -5973765338689236766L; 


} 

而且我的課MyDocument.java

import javax.swing.JLabel; 
import javax.swing.text.DefaultStyledDocument; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 


public class MyDocument extends DefaultStyledDocument { 

    public MyDocument(){ 
     BranchElement rootElement = (BranchElement) getDefaultRootElement(); 

     writeLock(); 
     LeafElement black10Element = (LeafElement) createLeafElement(rootElement, new SimpleAttributeSet(),0, 1); 
     JLabel black10 = new JLabel("10 ..."); 
     StyleConstants.setComponent(black10Element, black10); 
     writeUnlock(); 
    } 

    private static final long serialVersionUID = -7424640574620960694L; 

} 

這是錯誤堆棧跟蹤當我用writeLock()和writeUnlock()註釋行時:

Exception in thread "main" javax.swing.text.StateInvariantError: Illegal cast to MutableAttributeSet 
    at javax.swing.text.AbstractDocument$AbstractElement.checkForIllegalCast(AbstractDocument.java:2050) 
    at javax.swing.text.AbstractDocument$AbstractElement.addAttributes(AbstractDocument.java:1983) 
    at javax.swing.text.AbstractDocument$AbstractElement.<init>(AbstractDocument.java:1777) 
    at javax.swing.text.AbstractDocument$LeafElement.<init>(AbstractDocument.java:2502) 
    at javax.swing.text.AbstractDocument.createLeafElement(AbstractDocument.java:1275) 
    at MyDocument.<init>(MyDocument.java:13) 
    at MyEditorKit.createDefaultDocument(MyEditorKit.java:9) 
    at javax.swing.JEditorPane.setEditorKit(JEditorPane.java:1058) 
    at MyFrame.<init>(MyFrame.java:11) 
    at MyFrame.main(MyFrame.java:16) 

在此先感謝。

回答

1

我終於解決了我的問題:

只是改變了MyDocument.java這樣:

import javax.swing.JLabel; 
import javax.swing.event.DocumentEvent.EventType; 
import javax.swing.text.DefaultStyledDocument; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 


public class MyDocument extends DefaultStyledDocument { 

    public MyDocument(){ 
     BranchElement rootElement = (BranchElement) getDefaultRootElement(); 

     writeLock(); 

     LeafElement black10Element = (LeafElement) createLeafElement(rootElement, new SimpleAttributeSet(), 0, 1); 
     JLabel black10 = new JLabel("10 ..."); 
     StyleConstants.setComponent(black10Element, black10); 

     /////////////////// Added lines 
     DefaultDocumentEvent documentEvent = this.new DefaultDocumentEvent(0, 1, EventType.INSERT); 
     try { 
      getContent().insertString(0, " "); 
     } catch(BadLocationException e){ 
      e.printStackTrace(); 
     } 
     insertUpdate(documentEvent, black10Element); 
     documentEvent.end(); 
     fireInsertUpdate(documentEvent); 
     ///////////////////////////////////// 

     writeUnlock(); 
    } 


    private static final long serialVersionUID = -7424640574620960694L; 

} 

爲什麼這些添加的行?

那麼JGuru主題鏈接建議應該生成一個新的DocumentEvent:在我的情況下,它是一個插入事件。所以:

  1. 我創建這個實例的DocumentEvent
  2. 在插入一個字符串的文件的內容(否則,它不會增長:強制性這樣即使我只是用一個JComponent)=>的getContent ().insertString(偏移,字符串)
  3. 我使用它,以便在文檔中應用的變化(中的insertUpdate())
  4. 我將其標記爲 「未進行任何比較」(結束())
  5. 我通知所有文檔監聽器(fireInsertUpdate())