我有 JTextAreas,需要获取添加、删除或更改的字符。我该怎么做呢?
4 回答
添加很简单,您只需使用 DocumentListener。
要处理添加和删除,您可能可以使用 DocumentFilter。我相信当您添加/删除文本时会调用 replace() 方法。
编辑:
DocumentFilter 不会在删除时被调用。因此,了解删除(除了保留重复的 Document)的唯一方法是创建一个自定义 Document 并覆盖 remove(...) 方法。然后,您可以在将字符串从文档中删除之前将其提取出来。
@Override
public void insertUpdate(DocumentEvent e) {
Document document = e.getDocument();
int offset = e.getOffset();
int length = e.getLength();
try {
String changedTxt = document .getText(offset, length);
} catch (BadLocationException ex) {
Logger.getLogger(EditorListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
您可以获得偏移量和长度(甚至是 source Document
),因此可以从中读取字符。如果您想查看删除的字符是什么,您必须保留文档内容的副本。
Swing 文档应该是线程安全的(呵呵)。但是如果在其他线程中发生了多项更改(事件总是在 EDT 上触发只是为了让事情变得更有趣),那么角色数据可能不是最新的。对此你无能为力。甚至其他事件侦听器也可能最终间接更改文档内容。
通常,使用事件的简单方法是完全忽略事件对象。您需要知道的只是您正在收听的对象(可能已经)发生了一些变化。这应该为您提供健壮且更易于理解的代码。如果您真的需要进行更改,DocumentFilter
camickr 提到的是自 swingall.jar 以来添加到 Swing 的有用的东西(除了更好的本地 L&F 保真度)。
(注意,许多人没有阅读 DocumentListener.changedUpdate 的文档——它适用于属性更改,而不是字符。)
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
try {
int length=textArea.getText().length();
char lastCharacter=e.getDocument().getText(length-1,length)).charAt(0);
} catch (BadLocationException e1) {
logger.error(e1.getMessage());
}
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});