Mục tiêu của tôi là triển khai màu xanh của từ khóa được người dùng viết vào JTextPane. Đây là cách mã nhìn tôi như:Ngoại lệ 'Cố gắng thay đổi thông báo' ngoại lệ
private class DocumentHandler implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent ev) {
}
@Override
public void insertUpdate(DocumentEvent ev) {
highlight();
}
@Override
public void removeUpdate(DocumentEvent ev) {
highlight();
}
private void highlight() {
String code = codePane.getText();
SimpleAttributeSet defSet = new SimpleAttributeSet();
StyleConstants.setForeground(defSet, Color.BLACK);
doc.setCharacterAttributes(0, code.length(), defSet, true);
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setForeground(set, Color.BLUE);
for (String keyword : keywords) {
Pattern pattern = Pattern.compile(keyword + "(\\[\\])*");
Matcher matcher = pattern.matcher(code);
while (matcher.find()) {
//Just for test
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end());
System.out.println(" Found: " + matcher.group());
doc.setCharacterAttributes(matcher.start(), keyword.length(), set, true);
}
}
}
}
Sau khi gõ bất cứ điều gì vào cửa sổ tôi nhận được:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)
at javax.swing.text.DefaultStyledDocument.setCharacterAttributes(DefaultStyledDocument.java:500)
at jnotepad.MainPanel$DocumentHandler.highlight(MainPanel.java:121)
at jnotepad.MainPanel$DocumentHandler.insertUpdate(MainPanel.java:108)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:202)
at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:749)
Làm thế nào để giải quyết vấn đề của tôi? Có lẽ tôi nên sử dụng một cái gì đó khác hơn là DocumentListener?
Issue không phải là 'điểm nhấn() 'được thực hiện từ chủ đề sai. Thay vào đó, 'invokeLater (Runnable)' sửa chữa vấn đề vì nó trì hoãn việc thực hiện cho đến khi khóa Document được giải phóng. –