2009-02-19 34 views
5

我有一個例程,在滾動窗格中繪製一個瘋狂的大圖。在添加到scrollpane之前,繪畫太大了 - menory的要求將是幾個演出。爲什麼我的jscrollpane導致java swing中奇怪的paint調用?

由於圖的大小,我在滾動窗格的子項的paint方法內渲染圖表。哪一個效果不錯,但是我注意到每次移動滾動條時,我的繪畫例程都會被調用兩次 - 一次是剪裁矩形,等於滾動到的未覆蓋區域,第二次是剪裁矩形,等於視口的尺寸。

例如,如果我的視口245x195 &我由3個像素向下滾動我的油漆例行獲取與g.getClipBounds()一套名爲如下:

java.awt.Rectangle[x=0,y=195,width=245,height=3] 
java.awt.Rectangle[x=0,y=3,width=245,height=195] 

...因爲我的油漆程序中渲染這是造成閃爍(我儘可能快地做我的計算,但是我猜想有一點延遲)。問題:

  1. 有誰知道如何防止第二油漆通話?這是純粹的JScrollPane我在這裏做的東西 - 我有一個組件,我將它添加到scrollpane,我將scrollpane添加到父組件。即使在第一個圖像滾動演示@the swing tutorial中,您也可以看到此行爲。

  2. 如果#1的答案是'nope':任何人都可以想出一個處理這個問題的好方法嗎?我是否應該繪製某種圖像緩衝區,跟蹤最近的繪圖調用&如果可能,複製圖像?我無法想象這比重新渲染快得多,但任何洞察讚賞:-)

回答

4

我已經遇到了這個問題在.NET世界。雙緩衝應該可以解決你的問題。

如果您直接渲染到屏幕上顯示的表面,則無法控制「顯示」實際發生的時間。通常會發生的情況是:您開始渲染,屏幕上顯示尚未完成的圖像,完成渲染,然後最終顯示在屏幕上。

如果您通過清除背景顏色來開始渲染邏輯,則它將顯示爲閃光燈。雙緩衝防止這種情況,因爲它總是從完成的渲染中顯示。可能發生的最糟糕的情況是輕微的「撕裂」,但這僅在快速變化的動畫中才顯而易見。

即使你只想渲染一幅巨大的圖像的一部分,你仍然可以使用這種技術。只需將您需要的東西渲染到屏幕外表面(這是您想要的可見部分的大小)即可。然後當你完成後,將整個圖像一舉畫出到你的顯示器表面上。

+0

我唯一的問題是我無法緩衝整個圖像 - 它太大了。 這意味着我需要在繪製時保留緩衝區域,當我被調用以根據需要繪製()並將它們縫合在一起時檢查覆蓋範圍。 我想我會給它一個鏡頭,但我會延期看看是否有其他人有任何想法 – 2009-02-19 21:20:13

相關問題