基になる HTML ドキュメントへの変更を待機している DocumentListener を持つ JTextPane があります。コンテンツが変更されると、イベントは JTextPane.scrollToReference を使用してビューを特定の参照アンカーに移動します。問題は、JTextPane の基になるビューもドキュメントの変更をリッスンしていて、リスナーが実行されるまで更新されず、例外が発生することです。その特定のイベントの他のイベントリスナーの後に DocumentListener を強制的に実行する方法はありますか? または、コードを実行する前にビューが更新されるのを待つ方法はありますか?
3 に答える
最初に、最後に実行する必要があるリスナーに SwingUtilities.invokeLater() を使用してみてください。それでもうまくいかない場合は、独自の優先キューを作成してください。
Document は JTextComponents のモデルです。2 つ以上の Listener が Document に変更を書き込みました。
モデルが実装されたすべてのイベントをビューに呼び出す場合、すべてのイベントを実行する必要があります。ビューですべてのイベントが実行された場合にのみ、JViewport で移動できます。
実装されているリスナーはわかりませんが、FocusListener (ei) を使用した DocumentListener (例) は、RepaintManager からの素晴らしい例外で無限ループを作成できます
例外を生成するリスナーを削除し、本当に必要な場合はリスナーを追加し、使用中のリスナーをすぐに削除し、
リスナーの確実な順序付けや、model_to_view とその逆の間でマルチプレイされたリスナーからのイベントをスイングします。
Swing Action (Swing Timer から遅延) から必要なイベントをプッシュするか、Thread.sleep(int) によって非同期リスナー (フリーズ) をプッシュすることによって、Listeners がイベントを順次または徐々に起動するかどうかをテストできます。
これを実現するには、Viewport クラスと JScrollPane クラスを拡張する必要がありました。ビューポートの変更イベントのリスナーを公開し、そこにロジックを追加しました (これにより、レンダリング チェーンで実行される最後のコードになることが保証されます)。