Java 我自己插入一个元素
我试图在JEditorPane的重写DefaultStyledDocument(还提供了一个自定义EditorIt)中插入一个Leaf元素:但是我得到了一个javax.swing.text.StateInvariantError。 因此,按照a的指导,我添加了writeLock()和writeUnlock()调用,但这次我的JEditorPane仍然是空的。那么,我应该如何重写AbstractDocument的fireXXX()方法,以便通知该文档的所有侦听器呢 这里是我的主要类:MyFrame.javaJava 我自己插入一个元素,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
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事件。因此:
我终于解决了我的问题: 只需将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事件。因此: