java中监听document的变化

 1 package com.baorant;
 2 
 3 import java.awt.event.KeyAdapter;
 4 import java.awt.event.KeyEvent;
 5 import java.util.LinkedList;
 6 
 7 import javax.swing.Box;
 8 import javax.swing.BoxLayout;
 9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JPanel;
12 import javax.swing.JScrollPane;
13 import javax.swing.JTextArea;
14 import javax.swing.event.DocumentEvent;
15 import javax.swing.event.DocumentListener;
16 import javax.swing.text.BadLocationException;
17 import javax.swing.text.Document;
18 import javax.swing.undo.UndoableEdit;
19 
20 public class JavaDemo {
21     JFrame mainWin = new JFrame("监听Document对象");
22     JTextArea target = new JTextArea(4, 25);
23     JTextArea msg = new JTextArea(5, 35);
24     JLabel label = new JLabel("文本域的修改信息");
25     Document doc = target.getDocument();// 获得区域内的document对象
26     LinkedList<UndoableEdit> undoList = new LinkedList<>();
27     final int UNDO_COUNT = 20;
28 
29     public void init() {
30         msg.setEditable(false);
31         doc.addDocumentListener(new DocumentListener() {
32 
33             @Override
34             public void removeUpdate(DocumentEvent arg0) {
35                 int offset = arg0.getOffset();
36                 int len = arg0.getLength();
37                 msg.append("插入文本的长度:" + len + "
");
38                 msg.append("插入文本的起始位置:" + offset + "
");
39             }
40 
41             @Override
42             public void insertUpdate(DocumentEvent arg0) {
43                 int offset = arg0.getOffset();
44                 int len = arg0.getLength();
45                 msg.append("插入文本的长度:" + len + "
");
46                 msg.append("插入文本的起始位置:" + offset + "
");
47                 try {
48                     msg.append("插入文本内容:" + doc.getText(offset, len));
49                 } catch (BadLocationException evt) {
50                     evt.printStackTrace();
51                 }
52             }
53 
54             @Override
55             public void changedUpdate(DocumentEvent arg0) {
56                 // TODO Auto-generated method stub
57 
58             }
59         });
60         doc.addUndoableEditListener(e -> {
61             UndoableEdit edit = e.getEdit();
62             if (edit.canUndo() && undoList.size() < UNDO_COUNT) {
63                 undoList.add(edit);
64             } else if (edit.canUndo() && undoList.size() >= UNDO_COUNT) {
65                 undoList.pop();
66                 undoList.add(edit);
67             }
68         });
69         target.addKeyListener(new KeyAdapter() {
70             @Override
71             public void keyTyped(KeyEvent e) {
72                 if (e.getKeyChar() == 26) {
73                     if (undoList.size() > 0) {
74                         undoList.removeLast().undo();
75                     }
76                 }
77             }
78         });
79         Box box = new Box(BoxLayout.Y_AXIS);
80         box.add(new JScrollPane(target));
81         JPanel panel = new JPanel();
82         panel.add(label);
83         box.add(panel);
84         box.add(new JScrollPane(msg));
85         mainWin.add(box);
86         mainWin.pack();
87         mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
88         mainWin.setVisible(true);
89     }
90 
91     public static void main(String[] args) {
92         new JavaDemo().init();
93     }
94 }
原文地址:https://www.cnblogs.com/baorantHome/p/7050721.html