Google検索で数日掛かっており、paintComponentの処理中にpaintComponentが呼び出されているかどうかを判断する方法がわかりません。このプロセスは長く複雑です。ペイントする2番目(または3番目)のリクエストがある場合は、現在のペイントプロセスを中止し、最新のリクエストからやり直したいと思います。Java paintComponentが再び呼び出された場合に通知する
答えて
できません。 paintComponent()
へのコールはキューに入れられ、完了するまでEDTをブロックします。このAnimationTest
に示されているアプローチを使用して、実装を典型的なターゲットプラットフォームでセルフタイム化します。必要に応じて最適化してください。具体的な例として、このKineticModel
は、ユースケースに適用されるいくつかのアニメーションテクニックを示しています。
補足:「長く複雑な」プロセスには、後で表示するためにBufferedImage
を作成する必要があります。 EDTをブロックしないようにするには、SwingWorker
のバックグラウンドでこれを行います.の中間結果が得られるようになります。このexampleは、ラスタイメージを一度に1行作成することをシミュレートします。
この関連exampleは同様にTexturePaint
を構築します。
は、特定のガイダンスについては、お使いの修正されたアプローチを示しMinimal, Complete, and Verifiable exampleを含めるようにあなたの質問を編集します。
いつものように、私は1つを求めた後に解決策を考えています...私の解決策は、BufferedImageを徐々に更新するスレッドを起動することです。次にpaintComponentメソッドは2行だけです:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(myImage, 0, 0, null);
}
イメージは非常に素早く描画されます。イメージを再描画する前にイメージの既存のビューを消去するには、superを呼び出す必要があります。
その他の解決策は、パネルのmyImage属性を更新するスレッドを作成することです。私の仕事では、プログラムの入力に応じて、画像を完全に処理するのに約30分かかります。アプリケーションを実行している間にウィンドウをドラッグしたり、誤ってマウスホイールに触れない限り、大きな問題ではありません。次に、paintComponentが再度呼び出され、プログラムがハングします。このソリューションでは、更新に数日かかることがあります。また、ウィンドウのサイズ変更や移動が可能です。あなたはこれまでに処理されたイメージを見続けます。
マウスホイールのバンプの問題は、2つのイメージをバッファリングすることで修正できます。 paintComponentメソッドは、myOldImageを描画します。 myImageがレンダリングを終了するまで、myOldImageは更新されません。私はあなたのイメージがレンダリングするのに30分かかっている理由について興味があります。おそらく、計算を最初に行い、次にmyImageで図面を作成することができます。 –
これは質問に対する回答ではないかと思います。確かにあなたが遭遇した問題の種類につながるでしょう。ユースケースを反映するために質問を編集してください。関連する2つの例を挙げて私の答えを更新しました。 – trashgod
- 1. JavaのpaintComponent()が呼び出されていない
- 2. NSURLSessionTask再開が呼び出された場合、オブジェクトdeallocは呼び出されません
- 3. PaintComponentが呼び出されたときに配列のサイズが0になる
- 4. Java - foreach内の文が呼び出されない場合
- 5. 呼び出されたJavaプログラムの親クラスを知るには?
- 6. FunctionAが5秒以内に再度呼び出されない場合はFunctionBを呼び出します
- 7. 描画イメージのJava repaint()はpaintComponent()を呼び出さない
- 8. 初期化後にレルム通知が呼び出されない
- 9. applicationDidBecomeActiveが呼び出されたときにアクティブビューコントローラに通知する方法は?
- 10. PaintComponent()メソッドがmouseMoved()で呼び出されていない
- 11. JPanelでPaintComponentが呼び出されていない
- 12. Xamarin:通知呼び出しでIValueConverterを呼び出す方法
- 13. python - StringVar()でset()が呼び出された場合、tkinterウィジェットへのバインドが2回呼び出されます
- 14. UILocalNotification cancelAllLocalNotificationsを呼び出すと、呼び出されているアプリまたはすべての通知の通知のみがキャンセルされますか?
- 15. 状態が変更されたときにpaintComponent()で@Overrideを呼び出す
- 16. サービスが呼び出され、時にはサービスが呼び出されない場合があります
- 17. UIKeyboardWillChangeFrame Emojiキーボードで通知が呼び出されない
- 18. pygobject通知アクションでコールバックが呼び出されない
- 19. AndroidのFirebase通知「OnTokenRefresh」が呼び出されない
- 20. バックグラウンドモードでFCM通知メソッドが呼び出されない
- 21. ロケーションベースの通知がサスペンドモードで呼び出されていない
- 22. プッシュ通知機能の登録が呼び出されない
- 23. Swift - removeFromSuperview()が呼び出された後に通知を受け取る方法?
- 24. 関数(param)が呼び出された場合、unbeforeunload呼び出しをウィンドウにバインドする方法は?
- 25. addActionが呼び出されたときに通知を削除しますか?
- 26. テンプレートパラメータの比較がfalseの場合にステートメントが呼び出される場合
- 27. URLスキームが呼び出された場合のアプリケーションストアへのリダイレクト
- 28. paintComponent()関数の呼び出し
- 29. カスタムJComponentを追加するときにpaintComponentが呼び出されない
- 30. Response.Redirectが以前に呼び出された場合、Grid_NeedDataSource呼び出しを避ける
* ".. paintComponent。プロセスは長く複雑です。" *これは修正が必要な問題です。ペイントメソッドでは、「長時間実行されるタスク」を実行しないでください。 –
@AndrewThompson "いいえ、長時間実行している作業は、塗装方法で行うか、塗装方法から呼び出してください。"あなたは文字通り、Javaが長時間実行されるビジュアルアルゴリズムを処理することができないと述べています。私は、長時間実行されるビジュアル・アルゴリズムをペイント・メソッドをすばやく閉じる別のスレッドとして起動する必要があると述べました。より有益で、些細なことはしないでください。 – kainaw