gpt4 book ai didi

swing - 如何知道 JTextPane 中删除了哪些文本

转载 作者:行者123 更新时间:2023-12-03 06:55:17 44 4
gpt4 key购买 nike

我已将文档监听器添加到 JTextPane。我想知道添加或删除了哪些文本,以便在输入某些关键字时我可以采取行动。插入部分工作正常,但我不知道如何检测删除了哪些文本。

插入有效,因为文本在那里并且我可以选择它,但删除已经删除了文本,因此有时会出现位置错误的异常。

我想将不在引号内的保留字设为粗体,因此我需要知道删除了什么,即使删除一个字符(如引号)也可能产生巨大影响。

我的代码如下:

    @Override
public void insertUpdate(DocumentEvent e)
{
Document doc = e.getDocument();
String i = "";

try
{
i = doc.getText(e.getOffset(), e.getLength());
}
catch(BadLocationException e1)
{
e1.printStackTrace();
}

System.out.println("INSERT:" + e + ":" + i);
}

@Override
public void removeUpdate(DocumentEvent e)
{
Document doc = e.getDocument();
String i = "";

try
{
i = doc.getText(e.getOffset(), e.getLength());
}
catch(BadLocationException e1)
{
e1.printStackTrace();
}

System.out.println("REMOVE:" + e + ":" + i);
}

最佳答案

这很奇怪,没有简单的方法来获取这些信息。

我为此查看了 Swing 库的源代码。当然 - DocumentEvent中有此信息,属于 AbstractDocument$DefaultDocumentEvent 类,其中包含 protected Vector<UndoableEdit> edits ,其中包含一个 GapContent$RemoveUndo 类型的元素,其中包含 protected 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;
}

关于swing - 如何知道 JTextPane 中删除了哪些文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11695136/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com