2016-09-16 139 views
-1

一直在谷歌搜索了幾天,我不知道如何判斷paintComponent是否正在處理paintComponent時被調用。這個過程漫長而複雜。如果我有第二個(或第三個)繪畫請求,我想中止當前的繪畫過程並重新開始最近的請求。Java paintComponent告訴是否再次調用

+3

*「.. paintComponent。該過程漫長而複雜。」*這是需要修復的問題。不應該在塗漆方法中或者從塗漆方法中調用「長時間運行的任務」。 –

+1

@AndrewThompson「沒有'長時間運行的任務'應該在塗裝方法中完成或者從塗裝方法中調用。」你的字面意思是說Java不能處理長時間運行的可視化算法。我認爲你的意思是說,長時間運行的可視化算法應該作爲一個單獨的線程來啓動,以便快速關閉paint方法。試着做更多的信息和更少的隱瞞。 – kainaw

回答

4

你不能;呼叫paintComponent()正在排隊,阻止EDT直到完成。使用此AnimationTest中顯示的方法在典型目標平臺上自我計時實施。根據需要進行優化。作爲一個具體的例子,這個KineticModel舉例說明了幾種適用於你的用例的動畫技術。

附錄:您的更新表明,「漫長而複雜」的過程涉及構建一個BufferedImage以供以後顯示。爲避免阻止美國東部時間,請在SwingWorker的背景下執行此操作,您可以從中獲得臨時結果publish()。此example模擬一次構建一行柵格圖像。

buffered image

此相關example構建以類似的方式一個TexturePaint

textured image

對於具體的指導,編輯您的問題,包括一個Minimal, Complete, and Verifiable example顯示修改後的辦法。

0

像往常一樣,我想問一個解決方案後...我的解決方案是啓動一個線程,逐步更新BufferedImage。然後,paintComponent方法只有兩行:

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

該圖像繪製得非常快。在重畫圖像之前,需要調用super來擦除圖像的現有視圖。

解決方案的其餘部分是創建一個線程,更新面板的myImage屬性。在我的工作中,圖像需要大約30分鐘才能完成處理,具體取決於程序的輸入。除非在應用程序運行時拖動窗口或不小心觸摸鼠標滾輪,否則這不是什麼大問題。然後,再次調用paintComponent並掛起程序。使用此解決方案,更新可能需要幾天時間,您可以調整大小或移動窗口。你一直看到圖像,因爲它已被處理到目前爲止。

+0

您可以通過使用兩個緩衝圖像來解決鼠標滾輪碰撞問題。 paintComponent方法繪製myOldImage。直到myImage完成渲染後,myOldImage纔會更新。我很好奇爲什麼你的圖片需要30分鐘左右的渲染。也許你可以先進行計算,然後在myImage上進行繪圖。 –

+0

我不確定這是問題的答案。它肯定會導致你遇到的那種問題。請編輯您的問題以反映您的使用案例。我已經更新了我的答案,以引用兩個相關示例。 – trashgod

相關問題