夏が終わったと感じる瞬間って、どんな時?

DocumentListenerについて

JTextPaneのDocumentにDocumentListenerを設定しました。

例えば
public void insertUpdate(DocumentEvent e){
e.getDocument().insertString(e.getOffset(), "追加します", null);
}

こうすると何か文字を入力するとランタイムエラーになります。
[Attempt to mutate in notification]

DocumentListenerが動いてるときはDocumentを改変してはならないようです。
よって

public void insertUpdate(DocumentEvent e){
SwingUtilities.invokeLater( new InsertInvoker(e) );
}

class InsertInvoker implements Runnable{
public void run{
[Document編集処理](文字の色を変える、UndoManagerにイベントを追加する処理です。)
}
}
こうしたのですが今度は
ペーストを連続で行った場合や、
文字を選択した上で入力した場合(removeUpdateとinsertUpdateがほぼ同時に起きる)

にInsertInvokerやRemoveInvokerの処理がまとめて最後に行われるという
事態になってしまいました。

offsetの位置がずれてしまい、ぐちゃぐちゃになります。
insertUpdateが終わった瞬間にInsertInvokerが処理を行い、
その間他の処理を受け付けないようにしたいのですが

どうしたらいいでしょうか?

A 回答 (1件)

検索してみた限りでは、


DocumentFilter使えばいいのではないでしょうか。

http://typea.dip.jp/tips/wiki.cgi?page=JTextComp …
    • good
    • 0
この回答へのお礼

大変遅くなってすいません。

DocumentFilterを使ったところ
うまい具合に動くようになりました。

replaceメソッドの中でStyledDocumentを操作する仕様になりました。

有用なサイトの紹介などありがとうございました。

お礼日時:2010/09/27 11:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!