4

SwingUtilities.invokeAndWaitJava Swing の GUI コードは、または内に配置する必要があることを知っています SwingUtilities.invokeLater。このように、スレッド化は正常に機能します。

悲しいことに、私の状況では、GUI はバックグラウンド スレッドよりもはるかに時間がかかるものを更新します。より具体的には、約 400 エントリで JTree を更新します。ネストの深さは最大 4 です。ただし、1秒かかる場合もあります。ユーザーが遅延なく JTextPane に入力できるようにする必要があります。JTree の更新遅いと、入力中に JTextPane の遅延が発生します。ツリーが更新されるとすぐに更新されます。

私は Netbeans を使用しており、経験的に、Java アプリは残りの UI をフリーズすることなく多くの情報を更新できることを知っています。

どうすればそれができますか?

注 1: これらDefaultMutableTreeNodeはすべて の外部で準備されinvokeAndWaitます。
注2:ツリーに置き換えinvokeAndWaitinvokeLaterも更新されません。
注 3: 再帰的なツリー展開に最も時間がかかることに注意してください。
注 4: カスタム ツリー セル レンダラーを使用しています。使用せずに試して報告します。
注 4a: 私のツリー セル レンダラーはマップを使用して、作成された をキャッシュし、JTextComponentツリー ノードに応じて (キーとして) 再利用します。

手がかり 1 : うわー! カスタム セル レンダラーを設定しないと、 10 倍速くなります。カスタム ツリー セル レンダラーを作成するための適切なチュートリアルはほとんど必要ないと思います。残念ながら、カスタム セル レンダラーが必要です。

遅延読み込みに関するこのチュートリアルが役立つかもしれません。

4

2 に答える 2

2

[次のような詳細が欠落しています。ユーザーがJTextPaneを更新するたびに、どのような種類の処理が行われていますか。ツリー全体が再構築されていますか?]

とにかく、過去(JTreeの更新により大幅な速度低下が発生したとき)にうまくいったのは、自分のTreeModelをロールアウトしたことです。

ほとんどのプログラマーは、DefaultTreeModelを使用することを選択します。これは確かに、ほとんどの場合にうまく機能する既成のソリューションです。ただし、ツリーの重要な部分を更新する必要がある場合は、非常に時間がかかります。明らかに、独自のTableModelを作成することは、定型のソリューションを使用するよりも手間がかかりますが、思ったよりもはるかに簡単です。

特に、私のカスタムツリーモデルは、それ自体がツリーを構築しないため、高速です。ドメインモデルを監視し、そのモデルから関連情報を抽出することで、ドメインモデルで呼び出されたメソッド(getChild()、getParent()、...)に対する回答を計算します。それを試してみてください。それは魅力のように機能します。

于 2010-04-07T11:01:11.843 に答える
1

でしか動作しない理由はわかりませんがinvokeAndWait()(これは奇妙です)、単純なハックは、新しいバックグラウンド スレッドでこのメソッドを呼び出すことです。

また、すべてのツリーを一度に作成しないことをお勧めします。これは多くの場合、簡単に高速化できない膨大な量の作業です。代わりに、表示されているノードのみを更新し、ユーザーがノードを展開するにつれて、より多くのノードを更新します。

于 2010-04-07T11:03:16.593 に答える