写了一个文档类继承了DefaultStyledDocument复写(override)了 public void insertString(...)这个方法, 只是简单调用的super.insertString(offset, str, a);把数据插入到文档中, 这里没有任何问题.使用时问题却如下:
DefaultStyledDocument doc = new MyDocment();
doc安装了一个DocumentListener, 在insertUpdate中只是简单的输出语句提示有数据插入了.1: JTextPane editor = new JTextPane();
editor.setDocument(doc); 或者 editor.setStyledDocument(doc)
插入的字符都能正确的在界面中显示出来.
但问题来了, insertUpdate方法不会被调用, 说明这个事件没有更新.2: JTextPane editor = new JTextPane(doc);
有意思的是, 这次insertUpdate能正确调用, 说明插入事件更新了.谁知道这个问题怎么解决吗? 即是setDocument不起作用, 只能放在构造函数中.
DefaultStyledDocument doc = new MyDocment();
doc安装了一个DocumentListener, 在insertUpdate中只是简单的输出语句提示有数据插入了.1: JTextPane editor = new JTextPane();
editor.setDocument(doc); 或者 editor.setStyledDocument(doc)
插入的字符都能正确的在界面中显示出来.
但问题来了, insertUpdate方法不会被调用, 说明这个事件没有更新.2: JTextPane editor = new JTextPane(doc);
有意思的是, 这次insertUpdate能正确调用, 说明插入事件更新了.谁知道这个问题怎么解决吗? 即是setDocument不起作用, 只能放在构造函数中.
我之前碰到一个给JButton设置背景怎么都搞不定的问题,当时jdk是1.6u13,相同的代码在后来的一个版本里可以了。
下面这个程序两个不同的init方法就是你说的那两种情况
使用的时候注释掉其中任何一个
DocumentListener都能起作用import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;class MyDocument extends DefaultStyledDocument {
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
super.insertString(offs, str, a);
System.out.println("insert str = " + str);
}
}class MyListener implements DocumentListener {
public void changedUpdate(DocumentEvent e) {
System.out.println("update");
}
public void insertUpdate(DocumentEvent e) {
System.out.println("insert");
}
public void removeUpdate(DocumentEvent e) {
System.out.println("remove");
}
}public class Test extends JFrame {
private JTextPane pane;
private MyDocument doc;
private DocumentListener listener;
public Test() {
init();
setSize(100, 100);
getContentPane().add(pane);
}
public void init() {
pane = new JTextPane();
doc = new MyDocument();
listener = new MyListener();
doc.addDocumentListener(listener);
pane.setDocument(doc);
}
// public void init() {
// doc = new MyDocument();
// listener = new MyListener();
// doc.addDocumentListener(listener);
// pane = new JTextPane(doc);
// }
public static void main(String[] args) {
Test t = new Test();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
t.setVisible(true);
}
}
察看JTextPane源码里面做的也是一个操作public JTextPane(StyledDocument doc) {
this();
setStyledDocument(doc);
}你的代码里应该有其他问题
刚才用兄弟们的代码一试, %^^^^&**()^%%, 原来是Eclipse的输出平台没有自动跳出来(我设置为平时是隐藏的, 当有输出信息时才会自动跳出来), 到处找原因, 汗死.在问个问题, 在document中有没有什么办法修改光标的位置(因为在插入一些数据后, 光标的位置是要变化的, 例如插入'[', 然后自动插入']',这时默认光标的位置是在']'后面, 在这要把光标置于他们中间, 所以想自己控制光标的位置, 但是找了半天源码, 里面没找到, 好像有关的是buffer的pos, 但是这个是private的, 不知道怎么弄).
不使用JTextComponent.setCaretPosotion来设置光标位置, 因为自己继承了document, 如果能这样做, 就可以把他们之间的耦合性再降低一点.