这是奇怪的是,有没有简单的方法来获取这些信息。
我已经看过Swing库的源代码。当然 - DocumentEvent
中有这样的信息,其类型为AbstractDocument$DefaultDocumentEvent
,其中包含protected Vector<UndoableEdit> edits
,其中包含GapContent$RemoveUndo
类型的一个元素,其中包含protected String string
,仅在此类中使用(没有其他“包”类获取此类),而此RemoveUndo
类没有getter这个字段。
即使toString
没有表现出来(因为RemoveUndo
没有overrided toString
法):
[[email protected] 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;
}
这是讨厌的。 :)不知道我最终会做什么,但感谢一堆努力。 – BigMac66 2012-08-07 15:43:38