本教程适用于JDK 8。本页面中描述的示例和实践未利用后续版本中引入的改进,并可能使用已不再可用的技术。
请参阅Java语言变更,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
一个Swing文本组件使用Document来表示其内容。当文档的内容发生任何变化时,会触发文档事件。你将文档监听器附加到文本组件的文档上,而不是附加到文本组件本身上。详见实现文档过滤器了解更多信息。
下面的示例演示了两个纯文本组件上的文档事件。
CTRL-X(剪切)等键盘命令删除文本。CTRL-C(复制)和CTRL-V(粘贴)等键盘命令将文本从一个文本组件复制到另一个文本组件。你可以在DocumentEventDemo.java中找到这个示例的代码。以下是示例的文档事件处理代码:
public class DocumentEventDemo ... {
...//初始化:
textField = new JTextField(20);
textField.addActionListener(new MyTextActionListener());
textField.getDocument().addDocumentListener(new MyDocumentListener());
textField.getDocument().putProperty("name", "文本框");
textArea = new JTextArea();
textArea.getDocument().addDocumentListener(new MyDocumentListener());
textArea.getDocument().putProperty("name", "文本域");
...
class MyDocumentListener implements DocumentListener {
String newline = "\n";
public void insertUpdate(DocumentEvent e) {
updateLog(e, "插入到");
}
public void removeUpdate(DocumentEvent e) {
updateLog(e, "从中删除");
}
public void changedUpdate(DocumentEvent e) {
//纯文本组件不会触发这些事件
}
public void updateLog(DocumentEvent e, String action) {
Document doc = (Document)e.getDocument();
int changeLength = e.getLength();
displayArea.append(
changeLength + "个字符" +
((changeLength == 1) ? " " : "s ") +
action + doc.getProperty("name") + "." + newline +
" 文本长度 = " + doc.getLength() + newline);
}
}
文档监听器不应修改文档的内容;在监听器被通知到变化时,变化已经完成。相反,应编写一个自定义的文档类,重写insertString或remove方法,或两者都重写。有关详细信息,请参阅监听文档变化。
DocumentListener没有适配器类。
| 方法 | 用途 |
|---|---|
| changedUpdate(DocumentEvent) | 当监听的文档中的某些文本的样式发生更改时调用。这种事件只从StyledDocument中触发,PlainDocument不会触发这些事件。 |
| insertUpdate(DocumentEvent) | 当文本插入到监听的文档中时调用。 |
| removeUpdate(DocumentEvent) | 当文本从监听的文档中删除时调用。 |
每个文档事件方法都传递了一个实现了DocumentEvent接口的对象。通常,这是一个AbstractDocument中定义的DefaultDocumentEvent实例。
| 方法 | 目的 |
|---|---|
| Document getDocument() | 返回触发事件的文档。注意,DocumentEvent接口没有继承EventObject,因此它没有继承getSource方法。 |
| int getLength() | 返回更改的长度。 |
| int getOffset() | 返回更改的第一个字符在文档中的位置。 |
| ElementChange getChange(Element) | 返回关于文档中哪些元素发生了更改以及如何更改的详细信息。ElementChange是在DocumentEvent接口中定义的一个接口。 |
| EventType getType() | 返回发生的更改类型。EventType是在DocumentEvent接口中定义的一个类,列举了文档上可能发生的更改类型:插入文本、删除文本和更改文本样式。 |
以下表列出了使用Document监听器的示例。
| 示例 | 描述位置 | 注释 |
|---|---|---|
DocumentEventDemo |
本节 | 报告文本字段和文本区域上发生的所有文档事件。一个监听器同时监听两个文本组件,并使用文档上的客户端属性来确定哪个组件触发了事件。 |
TextComponentDemo |
监听文档变化 | 每当监听的文档中的文本发生变化时,更新一个变更日志。此示例中的文档支持样式文本,因此在此示例中调用changedUpdate方法。需要使用到另一个源文件:DocumentSizeFilter |