写了一个文档类继承了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不起作用, 只能放在构造函数中.

解决方案 »

  1.   

    看了看源代码,也是不能理解。你看看你的jdk版本啊,跳进去看看代码。
    我之前碰到一个给JButton设置背景怎么都搞不定的问题,当时jdk是1.6u13,相同的代码在后来的一个版本里可以了。
      

  2.   

    没有发现你说的情况
    下面这个程序两个不同的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);
    }你的代码里应该有其他问题
      

  3.   

    上次看贴主回复的另一个帖子,感觉你对swing的JTextComponent组件还是蛮熟悉的,应该不会犯低级错误。偶之前看过Manning Swing这本书,里边讲的蛮好。也写过一个swing的邮件编辑器,感觉它的文本处理太郁闷了。如果编辑功能要求不多,可以试着用JDIC的Browser试试。
      

  4.   

    哈哈, 我犯了一个超级白痴的晕招. 昨天我也看了DefaultStyledDocument的源码. 找了很久就是找不到原因.
    刚才用兄弟们的代码一试, %^^^^&**()^%%, 原来是Eclipse的输出平台没有自动跳出来(我设置为平时是隐藏的, 当有输出信息时才会自动跳出来), 到处找原因, 汗死.在问个问题, 在document中有没有什么办法修改光标的位置(因为在插入一些数据后, 光标的位置是要变化的, 例如插入'[', 然后自动插入']',这时默认光标的位置是在']'后面, 在这要把光标置于他们中间, 所以想自己控制光标的位置, 但是找了半天源码, 里面没找到, 好像有关的是buffer的pos, 但是这个是private的, 不知道怎么弄).
    不使用JTextComponent.setCaretPosotion来设置光标位置, 因为自己继承了document, 如果能这样做, 就可以把他们之间的耦合性再降低一点.