2016-09-16 20 views
-1

Google検索で数日掛かっており、paintComponentの処理中にpaintComponentが呼び出されているかどうかを判断する方法がわかりません。このプロセスは長く複雑です。ペイントする2番目(または3番目)のリクエストがある場合は、現在のペイントプロセスを中止し、最新のリクエストからやり直したいと思います。Java paintComponentが再び呼び出された場合に通知する

+3

* ".. paintComponent。プロセスは長く複雑です。" *これは修正が必要な問題です。ペイントメソッドでは、「長時間実行されるタスク」を実行しないでください。 –

+1

@AndrewThompson "いいえ、長時間実行している作業は、塗装方法で行うか、塗装方法から呼び出してください。"あなたは文字通り、Javaが長時間実行されるビジュアルアルゴリズムを処理することができないと述べています。私は、長時間実行されるビジュアル・アルゴリズムをペイント・メソッドをすばやく閉じる別のスレッドとして起動する必要があると述べました。より有益で、些細なことはしないでください。 – kainaw

答えて

4

できません。 paintComponent()へのコールはキューに入れられ、完了するまでEDTをブロックします。このAnimationTestに示されているアプローチを使用して、実装を典型的なターゲットプラットフォームでセルフタイム化します。必要に応じて最適化してください。具体的な例として、このKineticModelは、ユースケースに適用されるいくつかのアニメーションテクニックを示しています。

補足:「長く複雑な」プロセスには、後で表示するためにBufferedImageを作成する必要があります。 EDTをブロックしないようにするには、SwingWorkerのバックグラウンドでこれを行います.の中間結果が得られるようになります。このexampleは、ラスタイメージを一度に1行作成することをシミュレートします。

buffered image

この関連exampleは同様にTexturePaintを構築します。

textured image

は、特定のガイダンスについては、お使いの修正されたアプローチを示しMinimal, Complete, and Verifiable exampleを含めるようにあなたの質問を編集します。

0

いつものように、私は1つを求めた後に解決策を考えています...私の解決策は、BufferedImageを徐々に更新するスレッドを起動することです。次にpaintComponentメソッドは2行だけです:

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(myImage, 0, 0, null); 
} 

イメージは非常に素早く描画されます。イメージを再描画する前にイメージの既存のビューを消去するには、superを呼び出す必要があります。

その他の解決策は、パネルのmyImage属性を更新するスレッドを作成することです。私の仕事では、プログラムの入力に応じて、画像を完全に処理するのに約30分かかります。アプリケーションを実行している間にウィンドウをドラッグしたり、誤ってマウスホイールに触れない限り、大きな問題ではありません。次に、paintComponentが再度呼び出され、プログラムがハングします。このソリューションでは、更新に数日かかることがあります。また、ウィンドウのサイズ変更や移動が可能です。あなたはこれまでに処理されたイメージを見続けます。

+0

マウスホイールのバンプの問題は、2つのイメージをバッファリングすることで修正できます。 paintComponentメソッドは、myOldImageを描画します。 myImageがレンダリングを終了するまで、myOldImageは更新されません。私はあなたのイメージがレンダリングするのに30分かかっている理由について興味があります。おそらく、計算を最初に行い、次にmyImageで図面を作成することができます。 –

+0

これは質問に対する回答ではないかと思います。確かにあなたが遭遇した問題の種類につながるでしょう。ユースケースを反映するために質問を編集してください。関連する2つの例を挙げて私の答えを更新しました。 – trashgod

関連する問題