2013-05-10 61 views
1

我知道默認情況下JPanel是自動雙緩衝的。但是,我在面板上進行了特別耗時的繪畫操作,但只有在底層數據發生變化時才需要重新繪製面板,這很少見。因此,我想重複使用JPanel緩衝區,而不是在每次調用repaint()後清除它。如何取消重新繪製JPanel?

我已經手動在我的JPanel子類上實現了一個「髒」標誌,但我不知道如何在啓動後取消繪製操作。由於我的面板位於JScrollPane中,每次調整大小時都會重新繪製(其中的確經常發生),這導致我的自定義面板被重新繪製,所以我無法避免重新調用刷新。

有沒有辦法做到這一點,而無需手動緩衝面板?如果不是,那麼與JPanel一起實現手動緩衝區的推薦方法是什麼?

+0

您可以將'JPanel'的內容保存到'BufferedImage'中,並將其用於顯示,而不是在每次重繪時重新計算圖像。 – 2013-05-10 05:43:46

+0

@ExtremeCoders儘管可以[獲取組件的圖像](http://stackoverflow.com/a/5853992/418556),但這並不簡單。在標籤中顯示圖像是獲取具有不需要擴展任何內容的首選大小的GUI的一種方式。而且既然你有這個形象,你不妨直接畫它。 – 2013-05-10 06:04:25

回答

4

我具有特別耗時的噴塗操作..只需要重新繪製時底層數據的改變,這是罕見..

油漆的數據到BufferedImage,在顯示它JLabel。如果更改,請致電label.repaint()。例如。如this answer所示。

獎金顯示在標籤中的圖像是一種方式來獲得一個最佳的尺寸,不需要擴展任何一個GUI。要獲得顯示它的框架或對話框的完美大小,請致電pack()

+0

@mKorbel謝謝!我認爲將其升級爲答案需要額外的努力。該圖像是顯而易見的,鏈接以及最後評論的一部分。 :) – 2013-05-10 06:38:09