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 + "\n");
38 msg.append("插入文本的起始位置:" + offset + "\n");
39 }
40
41 @Override
42 public void insertUpdate(DocumentEvent arg0) {
43 int offset = arg0.getOffset();
44 int len = arg0.getLength();
45 msg.append("插入文本的长度:" + len + "\n");
46 msg.append("插入文本的起始位置:" + offset + "\n");
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 }