- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SwingのSwingWorkerについて)
SwingのSwingWorkerでテキストエディタの語句強調表示について
このQ&Aのポイント
- Javaでテキストエディタを作成しています。TeraPadのように特定の語句を強調表示したいのですが、SwingWorkerを使用して実装しています。しかし、SwingWorkerを利用すると無限ループが発生してしまいます。この原因はSwingWorkerで強調表示した際にDocumentListenerが反応しているためです。無限ループを回避するための対策方法を教えてください。
- Javaのテキストエディタで、特定の語句の強調表示を実装しています。これにはSwingWorkerを使用していますが、SwingWorkerを利用すると無限ループが発生してしまいます。この問題の原因は、SwingWorkerで強調表示する際にDocumentListenerが反応してしまい、無限ループが発生するためです。無限ループを回避するためにはどのような対策が必要でしょうか?
- 現在Javaでテキストエディタを作成しており、特定の語句を強調表示したいと考えています。これを実現するためには、SwingWorkerを使用しています。しかし、SwingWorkerを利用すると無限ループが発生してしまいます。この問題の原因は、SwingWorkerで強調表示する際にDocumentListenerが反応してしまい、無限ループが発生するからです。無限ループを回避するための解決策をご教示いただけませんか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>SwingWorkerで強調表示したときにもDocumentListenerが反応してるんでしょうか? 強調表示した際にもDocumentListenerは反応すると思います。AbstractDocument/DocumentListenerのAPI Documentの冒頭に非同期な更新に関する説明があります。それについてどういった配慮で設計されているのか上記質問の内容だけからは不明ですが、DocumentListenerがprocessによる強調表示の際に反応しないことを期待されているとすれば、まずはその点が問題ではないでしょうか。 まずはAPI Documentを見直してみたほうがよいかも知れません。
お礼
回答ありがとうございます 一応自己解決しました DocumentListener#changeUpdate DocumentListener#insertUpdate DocumentListener#removeUpdate のどのメソッドでも新たにワーカーを作成し、すぐにexecuteしていたのですが 強調表示の処理をproccesではなくdoneで実行するように変えて まだ他のワーカーの処理が終わっていなければなにもせず、 他のワーカーの処理が終わっていればexecuteする としたところうまく動作しました 具体的には、DocumentListenerを実装したクラスのフィールドでワーカーのLinkedListを作成し イベントが呼び出されるたびに先頭の要素をチェック 先頭の要素がnull→execute 先頭の要素がnullでない→処理が終わっていない→return; 先頭の要素がnullでない→処理が終わっている→先頭の要素を削除してexecute,そのワーカーをLinkedListに追加 みたいな感じになりました つまり、複数のスレッドで同時に処理していたのが原因だった?のでしょうか ありがとうございました