この情報を取得する簡単な方法がないのは奇妙です。
これについては、Swing ライブラリのソース コードを調べました。もちろん、この情報はDocumentEvent
にあり、これは クラスであり、をAbstractDocument$DefaultDocumentEvent
含みprotected Vector<UndoableEdit> edits
、 タイプ の要素を 1 つ含みます。これは、このクラスでのみ使用され (他の「パッケージ」クラスはこれを取得しません)、このクラスには getter がありません。このフィールド。GapContent$RemoveUndo
protected String string
RemoveUndo
それもtoString
表示されませんでした(メソッドRemoveUndo
をオーバーライドしていないためtoString
):
[javax.swing.text.GapContent$RemoveUndo@6303ddfd hasBeenDone: true alive: true]
これは私にとって非常に奇妙で、削除された文字列を取得する簡単な方法が他にあると信じていますが、それを達成する方法がわかりません。
あなたができることの1つは、最も明白です:
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;
}