Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我自己插入一个元素_Java_User Interface_Jeditorpane_Defaultstyleddocument - Fatal编程技术网

Java 我自己插入一个元素

Java 我自己插入一个元素,java,user-interface,jeditorpane,defaultstyleddocument,Java,User Interface,Jeditorpane,Defaultstyleddocument,我试图在JEditorPane的重写DefaultStyledDocument(还提供了一个自定义EditorIt)中插入一个Leaf元素:但是我得到了一个javax.swing.text.StateInvariantError。 因此,按照a的指导,我添加了writeLock()和writeUnlock()调用,但这次我的JEditorPane仍然是空的。那么,我应该如何重写AbstractDocument的fireXXX()方法,以便通知该文档的所有侦听器呢 这里是我的主要类:MyFrame

我试图在JEditorPane的重写DefaultStyledDocument(还提供了一个自定义EditorIt)中插入一个Leaf元素:但是我得到了一个javax.swing.text.StateInvariantError。 因此,按照a的指导,我添加了writeLock()和writeUnlock()调用,但这次我的JEditorPane仍然是空的。那么,我应该如何重写AbstractDocument的fireXXX()方法,以便通知该文档的所有侦听器呢

这里是我的主要类: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()注释行时出现的stacktrace错误:

线程“main”javax.swing.text.StateInvariantError中出现异常:非法转换到MutableAttributeSet
位于javax.swing.text.AbstractDocument$AbstractElement.checkForIllegalCast(AbstractDocument.java:2050)
位于javax.swing.text.AbstractDocument$AbstractElement.addAttributes(AbstractDocument.java:1983)
位于javax.swing.text.AbstractDocument$AbstractElement。(AbstractDocument.java:1777)
位于javax.swing.text.AbstractDocument$LeaveElement。(AbstractDocument.java:2502)
位于javax.swing.text.AbstractDocument.createLeafElement(AbstractDocument.java:1275)
在MyDocument上。(MyDocument.java:13)
在MyEditorKit.createDefaultDocument(MyEditorKit.java:9)
位于javax.swing.JEditorPane.setEditorKit(JEditorPane.java:1058)
在MyFrame上。(MyFrame.java:11)
位于MyFrame.main(MyFrame.java:16)

提前感谢。

我终于解决了我的问题:

只需将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:在我的例子中,它是一个insert事件。因此:

  • 我创建了这个DocumentEvent实例
  • 在文档的内容中插入一个字符串(否则,它不会增长:即使我只是使用JComponent,它也是必需的)=>getContent().insertString(偏移量,字符串)
  • 我使用它来应用文档中的更改(insertUpdate())
  • 我将其标记为“不再进行”(end())
  • 我通知所有文档侦听器(fireInsertUpdate())

  • 我终于解决了我的问题:

    只需将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:在我的例子中,它是一个insert事件。因此:

  • 我创建了这个DocumentEvent实例
  • 在文档的内容中插入一个字符串(否则,它不会增长:即使我只是使用JComponent,它也是必需的)=>getContent().insertString(偏移量,字符串)
  • 我使用它来应用文档中的更改(insertUpdate())
  • 我将其标记为“不再进行”(end())
  • 我通知所有文档侦听器(fireInsertUpdate())