一直在谷歌搜索了幾天,我不知道如何判斷paintComponent是否正在處理paintComponent時被調用。這個過程漫長而複雜。如果我有第二個(或第三個)繪畫請求,我想中止當前的繪畫過程並重新開始最近的請求。Java paintComponent告訴是否再次調用
回答
你不能;呼叫paintComponent()
正在排隊,阻止EDT直到完成。使用此AnimationTest
中顯示的方法在典型目標平臺上自我計時實施。根據需要進行優化。作爲一個具體的例子,這個KineticModel
舉例說明了幾種適用於你的用例的動畫技術。
附錄:您的更新表明,「漫長而複雜」的過程涉及構建一個BufferedImage
以供以後顯示。爲避免阻止美國東部時間,請在SwingWorker
的背景下執行此操作,您可以從中獲得臨時結果publish()
。此example模擬一次構建一行柵格圖像。
此相關example構建以類似的方式一個TexturePaint
。
對於具體的指導,編輯您的問題,包括一個Minimal, Complete, and Verifiable example顯示修改後的辦法。
像往常一樣,我想問一個解決方案後...我的解決方案是啓動一個線程,逐步更新BufferedImage。然後,paintComponent方法只有兩行:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(myImage, 0, 0, null);
}
該圖像繪製得非常快。在重畫圖像之前,需要調用super來擦除圖像的現有視圖。
解決方案的其餘部分是創建一個線程,更新面板的myImage屬性。在我的工作中,圖像需要大約30分鐘才能完成處理,具體取決於程序的輸入。除非在應用程序運行時拖動窗口或不小心觸摸鼠標滾輪,否則這不是什麼大問題。然後,再次調用paintComponent並掛起程序。使用此解決方案,更新可能需要幾天時間,您可以調整大小或移動窗口。你一直看到圖像,因爲它已被處理到目前爲止。
您可以通過使用兩個緩衝圖像來解決鼠標滾輪碰撞問題。 paintComponent方法繪製myOldImage。直到myImage完成渲染後,myOldImage纔會更新。我很好奇爲什麼你的圖片需要30分鐘左右的渲染。也許你可以先進行計算,然後在myImage上進行繪圖。 –
我不確定這是問題的答案。它肯定會導致你遇到的那種問題。請編輯您的問題以反映您的使用案例。我已經更新了我的答案,以引用兩個相關示例。 – trashgod
- 1. 如何重新繪製/再次調用paintComponent?
- 2. paintComponent()被調用了200次
- 3. Java - 調用paintComponent方法
- 4. Java重繪()不調用paintComponent
- 5. 告訴IPython在Dill激活後再次使用Pickle
- 6. 是否可以告訴應用已打開多少次?
- 7. 再次調用
- 8. 的paintComponent告訴我即時使用對象非圖形
- 9. ,我可以告訴它是否已經調用了ContinueWith?
- 10. 我可以告訴抽象方法是否已被調用?
- 11. 如何告訴樹面板再次呈現記錄?
- 12. 如何使用repaint調用java paintComponent
- 13. 詢問用戶是否想再次玩
- 14. 下次調用paintComponent()時,Graphics2D是否會重置組合?爲什麼?
- 15. Java:詢問用戶他們是否想再玩一次?
- 16. repaint()不調用paintComponent()
- 17. 是否需要在MediaRecorder :: reset()之後再次調用MediaRecorder :: setCamera()?
- 18. @ Html.Action()和@ Html.RenderAction()是否再次調用服務器?
- 19. 告訴頁面是否在內存中?
- 20. grails - 告訴我是否有髒東西?
- 21. 告訴HTTP客戶端是否斷開
- 22. PaintComponent不被調用
- 23. 告訴Chrome調試js而不是ts
- 24. 告訴我們,我們是否處於調試模式
- 25. 用JApplet調用paintComponent
- 26. paintComponent paint兩次
- 27. eclipse調試問題(再次)java apis
- 28. 單詞 - 你能否告訴用戶是否取消保存
- 29. repaint()不調用paintComponent()?
- 30. paintComponent()函數調用
*「.. paintComponent。該過程漫長而複雜。」*這是需要修復的問題。不應該在塗漆方法中或者從塗漆方法中調用「長時間運行的任務」。 –
@AndrewThompson「沒有'長時間運行的任務'應該在塗裝方法中完成或者從塗裝方法中調用。」你的字面意思是說Java不能處理長時間運行的可視化算法。我認爲你的意思是說,長時間運行的可視化算法應該作爲一個單獨的線程來啓動,以便快速關閉paint方法。試着做更多的信息和更少的隱瞞。 – kainaw