2010-05-07 19 views
8
DocumentListener dl = new MessageDocumentListener(); 
((AbstractDocument) nboxArea.getDocument()).setDocumentFilter(new DocumentFilter() { 
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
     string = string.replaceAll("\t", ""); 
     super.insertString(fb, offset, string,(javax.swing.text.AttributeSet) attr); 
    } 

    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
     text = text.replaceAll("\t", ""); 
     //TODO must do something here 
     super.replace(fb, offset, length, text,(javax.swing.text.AttributeSet) attrs); 
    } 
}); 

JTextArea evArea = (JTextArea) c; 
evArea.getDocument().removeDocumentListener(dl); 
evArea.setText(originalMessage); 

Trong trường hợp này tôi đã tìm thấy lỗi sau trong khi đặt văn bản trong vùng văn bản. Tôi không biết cách giải quyết.java.lang.IllegalStateException trong khi sử dụng Trình nghe Tài liệu trong TextArea, Java

Exception in thread "AWT-EventQueue-0" 
java.lang.IllegalStateException: Attempt to mutate in notification 

Tôi nghĩ rằng vấn đề là đặt văn bản trong tài liệu hoặc thiết lập tài liệu trong trình nghe tài liệu. Nhưng tôi không biết cách giải quyết vấn đề này. Làm ơn giúp tôi giải quyết vấn đề này.

Trả lời

9

Bạn không thể sửa đổi tài liệu bên trong Trình ghi tài liệu. Thay vào đó, hãy viết một Document tùy chỉnh, ghi đè lên các phương thức insertString() hoặc remove().

Từ Java Hướng dẫn: How to write a DocumentListener

Document người nghe không nên thay đổi các nội dung của tài liệu; Thay đổi đã hoàn tất vào thời điểm người nghe được thông báo về thay đổi. Thay vào đó, hãy viết một tài liệu tùy chỉnh ghi đè phương thức insertString hoặc remove, hoặc cả hai. Xem Listening for Changes on a Document để biết chi tiết.

3

Nếu bạn muốn thay đổi trong trình nghe, bạn có thể khởi chạy một chuỗi riêng để thực hiện sau này với SwingUtilities.invokeLater. Hãy cẩn thận vì các sửa đổi từ chuỗi riêng biệt sẽ gọi lại cho người nghe, vì vậy hãy đặt boolean trước khi khởi chạy chuỗi, trả về ngay lập tức từ người nghe nếu nó được đặt và đặt lại sau khi sửa đổi đã được thực hiện trong chuỗi riêng biệt.

Các vấn đề liên quan