我可以分只有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”这三个字符,上面的代码也可以监听到这个动作,但是这个动作不需要发给其他的用户,因为这个动作不是自己产生的。问题来了,怎么判断监听到的这个动作谁产生的。
白板区可以实现文本的操作,就是平时我们在使用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”这三个字符,上面的代码也可以监听到这个动作,但是这个动作不需要发给其他的用户,因为这个动作不是自己产生的。问题来了,怎么判断监听到的这个动作谁产生的。
解决方案 »
- 这算是Properties类的一个Bug吗?
- 紧急求助:socket编程问题:怎样在关闭一个数据流的情况下,不关闭socket
- jdk 1.4.2中如何获取系统环境变量?
- 救命在线等,我这个画线Applet怎么重绘时总有线在上面,救命
- 调用同一个包下的几个自定义类为何无法编译?
- 使用java生成唯一标识?
- 请教各位大侠:System.exit()中的参数0和1代表什么意思?在线等待
- 谁知道哪里有jbulider4下载,我的机器跑jbulider5很慢!
- 有什么学习java的好网站呀?
- 请问Swing中的JScrollPane有没有滚动事件?
- java j2se基础类进不去了,只能在这个栏里问了~(关于连接数据库,并查询的问题)
- 如何给浮点型的数据限制小数点后的位数
这个是我写的关于自定义事件的,
但解决不了这个问题,
因为不能实现DocumentEvent的功能,
自定义的事件能不能自己继承AbstractDocument.DefaultDocumentEvent?但不知道要怎么做。
哎
系统卡了
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;
}