2013-03-09 4 views
1

Я пытаюсь вставить элемент LeafElement внутри переопределенного DefaultStyledDocument (также предоставляющего пользовательский EditorKit) для JEditorPane: но я получаю javax.swing.text.StateInvariantError. Итак, следуя правильности JGuru forum topic, я добавил вызовы writeLock() и writeUnlock(), но на этот раз моя JEditorPane остается пустой. Итак, как мне переопределить методы fireXXX() AbstractDocument, чтобы уведомить всех слушателей документа?Вставка самого 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; 

} 

Это StackTrace ошибка когда я комментирую строки с 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 (офсет, String)
  3. Я использую его для того, чтобы применить изменения в документе (insertUpdate())
  4. Я отмечаю это как "не выполняется больше" (конец())
  5. Я уведомляю всех слушателей документа (fireInsertUpdate())