如何编写文档监听器
Swing 文本组件使用Document表示其内容。文档内容以任何方式更改时,都会发生文档事件。您将文档侦听器附加到文本组件的文档,而不是文本组件本身。有关更多信息,请参见实现文档过滤器。
下面的示例演示了两个纯文本组件上的文档事件。
Try this:
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 DocumentEventDemo。另外,要自己编译和运行示例,请查阅example index。
-
键入窗口左上方的文本字段或该文本字段下方的文本区域。
每个键入的字符都会触发一个文档事件。 -
使用退格键删除文本。
每个键入的 Backspace 键都会触发一个文档事件。 -
选择文本,然后通过键入退格键或使用键盘命令(例如
CTRL-X
(剪切))将其删除。
整个删除都会触发一个文档事件。 -
使用键盘命令(例如
CTRL-C
(复制)和CTRL-V
(粘贴))将文本从一个文本组件复制到另一个文本组件。
无论粘贴文本的 Long 度如何,都会为整个粘贴操作触发一个文档事件。如果在发布粘贴命令之前在目标文本组件中选择了文本,则会触发其他文档事件,因为首先删除了所选文本。
您可以在DocumentEventDemo.java中找到该演示的代码。这是演示的文档事件处理代码:
public class DocumentEventDemo ... {
...//where initialization occurs:
textField = new JTextField(20);
textField.addActionListener(new MyTextActionListener());
textField.getDocument().addDocumentListener(new MyDocumentListener());
textField.getDocument().putProperty("name", "Text Field");
textArea = new JTextArea();
textArea.getDocument().addDocumentListener(new MyDocumentListener());
textArea.getDocument().putProperty("name", "Text Area");
...
class MyDocumentListener implements DocumentListener {
String newline = "\n";
public void insertUpdate(DocumentEvent e) {
updateLog(e, "inserted into");
}
public void removeUpdate(DocumentEvent e) {
updateLog(e, "removed from");
}
public void changedUpdate(DocumentEvent e) {
//Plain text components do not fire these events
}
public void updateLog(DocumentEvent e, String action) {
Document doc = (Document)e.getDocument();
int changeLength = e.getLength();
displayArea.append(
changeLength + " character" +
((changeLength == 1) ? " " : "s ") +
action + doc.getProperty("name") + "." + newline +
" Text length = " + doc.getLength() + newline);
}
}
文档侦听器不应修改文档的内容;更改已在通知侦听器时完成。而是编写覆盖insertString
或remove
方法或两者的自定义文档。有关详情,请参见聆听文档中的更改。
文档监听器 API
DocumentListener
没有适配器类.*
Method | Purpose |
---|---|
changedUpdate(DocumentEvent) | 当侦听文档中某些文本的样式更改时调用。仅从StyledDocument 触发此类事件-PlainDocument 不会触发这些事件。 |
insertUpdate(DocumentEvent) | 在将文本插入到收听的文档中时调用。 |
removeUpdate(DocumentEvent) | 从侦听文档中删除文本时调用。 |
每个文档事件方法都传递一个实现DocumentEvent
interface的对象。通常,这是AbstractDocument
中定义的DefaultDocumentEvent的实例。
Method | Purpose |
---|---|
Document getDocument() | 返回触发事件的文档。请注意,DocumentEvent interface不会从EventObject 继承。因此,它不会继承getSource 方法。 |
int getLength() | 返回更改的 Long 度。 |
int getOffset() | 返回文档中第一个字符更改的位置。 |
ElementChange getChange(Element) | 返回有关文档中哪些元素已更改以及如何更改的详细信息。 ElementChange是在DocumentEvent interface中定义的interface。 |
EventType getType() | 返回发生的更改的类型。 EventType是在DocumentEvent interface中定义的类,该类枚举可能对文档进行的更改:插入文本,删除文本和更改文本样式。 |
使用文档监听器的示例
下表列出了使用文档侦听器的示例。
Example | Where Described | Notes |
---|---|---|
DocumentEventDemo | This section | 报告文本字段和文本区域在文档上发生的所有文档事件。一个侦听器侦听这两个文本组件,并使用文档上的 client 属性来确定触发该事件的组件。 |
TextComponentDemo | 聆听文档中的更改 | 每次侦听文档中的文本更改时,都会更新更改日志。本示例中的文档支持样式文本,因此在本示例中调用changedUpdate 。需要此其他源文件:DocumentSizeFilter |