我使用a DocumentListener来处理JTextPane文档中的任何更改。而用户键入我想删除的内容JTextPane并插入 自定义文本。无法在中更改文档DocumentListener,而是在此处说一个解决方案:java.lang.IllegalStateException在Java的TextArea中使用文档侦听器时,但我
DocumentListener
JTextPane
java.lang.IllegalStateException
TextArea中
DocumentListener实际上仅对更改通知有用,决不能用于修改文本字段/文档。
而是使用DocumentFilter
DocumentFilter
检查这里的例子
费耶
您问题的根源DocumentListener是在文档更新时通知。尝试修改文档(除了可能导致无限循环),将文档置于无效状态,因此是异常
更新了一个例子
这是一个非常基本的示例……它不处理插入或删除操作,但是我的测试删除了删除操作,却未做任何事情……
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); } } } } }