一直在谷歌搜索了幾天,我不知道如何判斷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. 告訴IPython在Dill激活後再次使用Pickle
- 4. 是否可以告訴應用已打開多少次?
- 5. ,我可以告訴它是否已經調用了ContinueWith?
- 6. 如何使用repaint調用java paintComponent
- 7. Java:詢問用戶他們是否想再玩一次?
- 8. PaintComponent不被調用
- 9. @ Html.Action()和@ Html.RenderAction()是否再次調用服務器?
- 10. grails - 告訴我是否有髒東西?
- 11. 告訴Chrome調試js而不是ts
- 12. 告訴我們,我們是否處於調試模式
- 13. eclipse調試問題(再次)java apis
- 14. 誰在調用paintComponent?
- 15. 再次調用ViewDidLoad方法
- 16. 服務再次調用
- 17. 在Graphics2D上調用drawRect方法是否觸發paintComponent方法?
- 18. 重寫paintComponent兩次
- 19. Java PaintComponent not Called
- 20. 如果再次調用預加載器,是否再次下載了預加載的圖像?
- 21. 是否可以告訴應用程序是否禁用了Nagle的算法?
- 22. 我怎樣才能一般地告訴Java類是否是原始類型?
- 23. Java:告訴一個字節數組是否是一個zip文件
- 24. 告訴庫
- 25. 是否可以告訴sed每行最多執行一次替換?
- 26. 是否可以告訴IDLE python shell每次啓動時自動導入模塊?
- 27. paintComponent和getTableCellRendererComponent未被調用
- 28. 設置BorderLayout和paintComponent()調用
- 29. PaintComponent不會被JPanel調用
- 30. 重繪不調用的paintComponent
*「.. paintComponent。該過程漫長而複雜。」*這是需要修復的問題。不應該在塗漆方法中或者從塗漆方法中調用「長時間運行的任務」。 –
@AndrewThompson「沒有'長時間運行的任務'應該在塗裝方法中完成或者從塗裝方法中調用。」你的字面意思是說Java不能處理長時間運行的可視化算法。我認爲你的意思是說,長時間運行的可視化算法應該作爲一個單獨的線程來啓動,以便快速關閉paint方法。試着做更多的信息和更少的隱瞞。 – kainaw