如何编写文档监听器

Swing 文本组件使用Document表示其内容。文档内容以任何方式更改时,都会发生文档事件。您将文档侦听器附加到文本组件的文档,而不是文本组件本身。有关更多信息,请参见实现文档过滤器

下面的示例演示了两个纯文本组件上的文档事件。

此屏幕快照演示了 DocumentEventDemo 示例的输出。

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);
    }
}

文档侦听器不应修改文档的内容;更改已在通知侦听器时完成。而是编写覆盖insertStringremove方法或两者的自定义文档。有关详情,请参见聆听文档中的更改

文档监听器 API

DocumentListener interface

  • DocumentListener没有适配器类.*
MethodPurpose
changedUpdate(DocumentEvent)当侦听文档中某些文本的样式更改时调用。仅从StyledDocument触发此类事件-PlainDocument不会触发这些事件。
insertUpdate(DocumentEvent)在将文本插入到收听的文档中时调用。
removeUpdate(DocumentEvent)从侦听文档中删除文本时调用。

DocumentEvent interface

每个文档事件方法都传递一个实现DocumentEventinterface的对象。通常,这是AbstractDocument中定义的DefaultDocumentEvent的实例。

MethodPurpose
Document getDocument()返回触发事件的文档。请注意,DocumentEventinterface不会从EventObject继承。因此,它不会继承getSource方法。
int getLength()返回更改的 Long 度。
int getOffset()返回文档中第一个字符更改的位置。
ElementChange getChange(Element)返回有关文档中哪些元素已更改以及如何更改的详细信息。 ElementChange是在DocumentEventinterface中定义的interface。
EventType getType()返回发生的更改的类型。 EventType是在DocumentEventinterface中定义的类,该类枚举可能对文档进行的更改:插入文本,删除文本和更改文本样式。

使用文档监听器的示例

下表列出了使用文档侦听器的示例。

ExampleWhere DescribedNotes
DocumentEventDemoThis section报告文本字段和文本区域在文档上发生的所有文档事件。一个侦听器侦听这两个文本组件,并使用文档上的 client 属性来确定触发该事件的组件。
TextComponentDemo聆听文档中的更改每次侦听文档中的文本更改时,都会更新更改日志。本示例中的文档支持样式文本,因此在本示例中调用changedUpdate。需要此其他源文件:DocumentSizeFilter