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 }