奇怪的是,没有简单的方法来获取这些信息。
为此,我查看了 Swing 库的源代码。当然 - 中有这个信息DocumentEvent
,它属于 class AbstractDocument$DefaultDocumentEvent
,其中 contains protected Vector<UndoableEdit> edits
,其中包含一个 type 元素GapContent$RemoveUndo
,其中 containsprotected String string
仅在这个类中使用(没有其他“包”类得到这个)并且这个RemoveUndo
类没有 getter这个领域。
甚至toString
没有显示它(因为RemoveUndo
没有覆盖toString
方法):
[javax.swing.text.GapContent$RemoveUndo@6303ddfd hasBeenDone: true alive: true]
这对我来说太奇怪了,我相信还有其他一些简单的方法可以获取删除的字符串,而我只是不知道如何完成它。
您可以做的一件事是最明显的:
final JTextArea textArea = new JTextArea();
textArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
previousText = textArea.getText();
}
});
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
if(previousText != null) {
String removedStr = previousText.substring(e.getOffset(), e.getOffset() + e.getLength());
System.out.println(removedStr);
}
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});
其中previousText
是一个实例变量。
或(有史以来最讨厌的):
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
String removedString = getRemovedString(e);
System.out.println(removedString);
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});
加上这个方法:
public static String getRemovedString(DocumentEvent e) {
try {
Field editsField = null;
Field[] fields = CompoundEdit.class.getDeclaredFields();
for(Field f : fields) {
if(f.getName().equals("edits")) {
editsField = f;
break;
}
}
editsField.setAccessible(true);
List edits = (List) editsField.get(e);
if(edits.size() != 1) {
return null;
}
Class<?> removeUndo = null;
for(Class<?> c : GapContent.class.getDeclaredClasses()) {
if(c.getSimpleName().equals("RemoveUndo")) {
removeUndo = c;
break;
}
}
Object removeUndoInstance = edits.get(0);
fields = removeUndo.getDeclaredFields();
Field stringField = null;
for(Field f : fields) {
if(f.getName().equals("string")) {
stringField = f;
break;
}
}
stringField.setAccessible(true);
return (String) stringField.get(removeUndoInstance);
}
catch(SecurityException e1) {
e1.printStackTrace();
}
catch(IllegalArgumentException e1) {
e1.printStackTrace();
}
catch(IllegalAccessException e1) {
e1.printStackTrace();
}
return null;
}