我可以分只有20分,没办法,不然这个帖要是解决了,肯定不止给20分。我做一个协同编辑系统,有个白板区,用JTextArea实现,整个系统采用c/s模式,用java实现。
白板区可以实现文本的操作,就是平时我们在使用JTextArea时可以对它上面的内容进行任意的修改,所有的用户在本地的操作是没有限制的,即马上应用到本地。JTextArea上的内容,在每个客户端都有一份拷贝。为了实现一致性的控制,使用转换操作的算法。现在的问题是JTextArea上的内容,可能是用户通过键盘自己改变的,也可能是从别的用户那边传过来的,我通过下面的代码进行监听JTextArea上内容的变化:
myJTextArea.getDocument().addDocumentListener(new DocumentListener() {
                  public void insertUpdate(DocumentEvent e) {
                        System.out.println("插入。");
                        int offset = e.getOffset();
                        int length = e.getLength();
                        System.out.println("长度" + length);
                        try {
                              System.out.println("Insert:" +myJTextArea.getText(offset,length));
                              System.out.println(myJTextArea.getText(offset, length).equalsIgnoreCase("\n"));
                        }
                        catch (BadLocationException ex) {
                              ex.printStackTrace();
                        }
                  }
                  public void removeUpdate(DocumentEvent e) {
                        System.out.println("删除。");
                        System.out.println("Start:" + e.getOffset());
                        System.out.println("长度:" + e.getLength());
                  }
                  public void changedUpdate(DocumentEvent e) {
                        System.out.println("更新。");
                  }
            });
如果监听到了一个动作,这个动作的来源有下面两种:
①用户A自己通过键盘和鼠标,对JTextArea进行的修改,比如说用户在文本的开始位置(0位置)插入了一个字符,这个插入字符的事件被监听到,为insert(“a”,0).那么就把这个操作发给其他客户端。
②如果用户B传过来一条消息,要在4这个位置插入“123”这三个字符,上面的代码也可以监听到这个动作,但是这个动作不需要发给其他的用户,因为这个动作不是自己产生的。问题来了,怎么判断监听到的这个动作谁产生的。

解决方案 »

  1.   

    http://blog.csdn.net/jsjboss/archive/2006/05/26/756541.aspx
    这个是我写的关于自定义事件的,
    但解决不了这个问题,
    因为不能实现DocumentEvent的功能,
    自定义的事件能不能自己继承AbstractDocument.DefaultDocumentEvent?但不知道要怎么做。

    系统卡了
      

  2.   

    第一步:
    document有一个
    putProperty(Object key, Object value) 
    方法。你自定义一个property,比如"REMOTE_PROCESS",用来表示远程操作。在执行远程的插入之前,你先执行:document.putProperty("REMOTE_PROCESS", Boolean.valueOf(true));操作执行完毕,再执行document.putProperty("REMOTE_PROCESS", Boolean.valueOf alse);第二步:

    public void insertUpdate(DocumentEvent e) 等方法中添加如下代码:Document document = e.getDocument();Boolean remoteProcess = (Boolean)document.getProperty("REMOTE_PROCESS");
    if (remoteProcess) {
        return;
    }