问题描述
我使用 DocumentListener
来处理 JTextPane
文档中的任何更改。而用户类型我想删除 JTextPane
的内容,而是插入自定义文本。无法在 DocumentListener
中更改文档,而是在此处说出一个解决方案:
,但我不知道我明白,至少我不知道该怎么办?
I use a DocumentListener
to handle any change in a JTextPane
document. while the user types i want to delete the contents of JTextPane
and insert a customized text instead. it is not possible to change the document in the DocumentListener
,instead a solution is said here:java.lang.IllegalStateException while using Document Listener in TextArea, Java,but i don't understand that, at least i don't know what to do in my case?
推荐答案
DocumentListener
实际上只适用于更改通知,不应该用于修改文本字段/文档。
DocumentListener
is really only good for notification of changes and should never be used to modify a text field/document.
相反,使用
Instead, use a DocumentFilter
查看了解示例
仅供参考
问题的根本课程是 DocumentListener
在文档更新时通知>。尝试修改文档(除了冒无限循环的风险)使文档处于无效状态,因此异常
The root course of your problem is that the DocumentListener
is notified WHILE the document is been updated. Attempts to modify the document (apart from risking a infinite loop) put the document into a invalid state, hence the exception
更新示例
这是非常基本的例子......它不处理插入或删除,但是我的测试已经删除了工作而没有做任何事情......
This is VERY basic example...It doesn't handle insert or remove, but my testing had remove working without doing anything anyway...
public class TestHighlight {
public static void main(String[] args) {
new TestHighlight();
}
public TestHighlight() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTextPane textPane = new JTextPane(new DefaultStyledDocument());
((AbstractDocument) textPane.getDocument()).setDocumentFilter(new HighlightDocumentFilter(textPane));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(textPane));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class HighlightDocumentFilter extends DocumentFilter {
private DefaultHighlightPainter highlightPainter = new DefaultHighlightPainter(Color.YELLOW);
private JTextPane textPane;
private SimpleAttributeSet background;
public HighlightDocumentFilter(JTextPane textPane) {
this.textPane = textPane;
background = new SimpleAttributeSet();
StyleConstants.setBackground(background, Color.RED);
}
@Override
public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
System.out.println("insert");
super.insertString(fb, offset, text, attr);
}
@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
System.out.println("remove");
super.remove(fb, offset, length);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
String match = "test";
super.replace(fb, offset, length, text, attrs);
int startIndex = offset - match.length();
if (startIndex >= 0) {
String last = fb.getDocument().getText(startIndex, match.length()).trim();
System.out.println(last);
if (last.equalsIgnoreCase(match)) {
textPane.getHighlighter().addHighlight(startIndex, startIndex + match.length(), highlightPainter);
}
}
}
}
}
这篇关于java更改DocumentListener中的文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!