2015-10-21 25 views
0

我有這個循環中,collectionrepaint()的JPanel continiously重繪()的JPanel如果以前重繪()完成

while(loop) { 
     imageicon = (ImageIcon) ois.readObject(); 
     image = imageicon.getImage(); 
     cjpanel.tempimage = image; 
     cjpanel.repaint(); 
     Thread.sleep(100); 
    } 

cjpanel延長在那裏我已經覆蓋paintComponent(),我使用Double buffering

@Override 
public void paintComponent(Graphics g) { 
super.paintComponent(g); 
tempimage.getScaledInstance(dim.width, dim.height, Image.SCALE_FAST); 
bufferGraphics.clearRect(0,0,dim.width,dim.width); 
bufferGraphics.drawImage(tempimage,0,0,dim.width,dim.height, null); 
g.drawImage(offscreen,0,0,this); 
} 
的JPanel

我的問題是repaint始終是while循環後面的兩幀。即如果image 4while環路,則paintComponent()是借鑑`圖像2.

所以,我怎麼能加快repaint或停止以前repaint之前新repaint做?

UPDATE

,當我從ObjectInputStream的改變圖像的大小,它工作正常。我認爲這是做圖像尺寸東西..

+1

你的'while'循環在哪裏?使用'image'的代碼在哪裏?此外,您正在調用'tempimage.getScaledInstance',但您忽略了返回的縮放圖像。另外,保持相同的'bufferGraphics'對象「打開」應該在理論上工作,但是在我看來,它具有不好的代碼味道。最後,JPanel做了自己的雙緩衝,所以你可能應該把你的圖像傳遞給一個'drawImage'方法,它需要四個int參數,而不是自己調整它。 – VGR

+0

@VGR請看到我的最新的問題..我使用'cjpanel'顯示圖像 –

+2

「*和我使用雙緩衝*」搖擺已經雙緩衝,你不需要做任何事情。 – user1803551

回答

2
  1. 你不應該while循環中重新讀取圖像。一次讀取圖像並將它們存儲在一個變量中,可能是一個集合,如ArrayList。
  2. 根據您的使用方式將它們存儲爲圖像或圖標。當您可以將圖像存儲爲圖像時,無需在圖標上調用getImage()。
  3. 請勿使用while循環,而應使用Swing Timer,以免與Swing線程規則發生衝突。
  4. 你在尋求調試幫助,本質上,「爲什麼不按預期工作?」幫助,所以如果一般性建議沒有幫助,您確實必須強烈考慮創建併發布我們能夠編譯,運行並幫助識別您的問題所需的最短代碼,minimal example program(請檢查鏈接)。否則,除了提供一般性建議外,我們無法提供幫助,正如我以上所做的那樣。我同意我所要求的並不是一件容易或快速的事情,因爲這需要您付出相當大的努力,但如果您仍然陷於困境並需要解決方案,那麼將花費精力。由你決定,完全取決於你的需要。所以,如果你畫一幀的每個圖像,某些圖像可能不會顯示
+0

'tempimage'在'paintComponent'是圖像,所以我要的getImage() –

+1

@reenleedr :;嗯,....你的[mcve]? –

+0

@reenleedr:你需要調試幫助,本質上,「爲什麼這個代碼不按預期工作?」幫助,所以如果一般建議沒有幫助,您必須創建併發布最短的代碼,以便我們能夠編譯,運行並幫助識別您的問題。否則,除了提供一般性建議外,我們無法提供幫助,正如我以上所做的那樣。 –

2

重繪經理可以摺疊到repaint連續通話。您可以使用paintImmediately強制重繪:

繪製指定的區域在此組件及其所有子重疊區域,立即執行。

很少有必要調用此方法。在大多數情況下,重新調用repaint會更有效率,它可以延遲實際的繪製,並且可以將多餘的請求合併爲一次繪製調用。如果在調度當前事件時需要更新顯示,此方法非常有用。

至於

,當我從ObjectInputStream的改變圖像的大小,它工作正常。

它可能會影響重繪管理器的計算,以及重繪調用的崩潰方式。

我建議你試試這個方法,看看它的工作原理,但它是更難以實現(請仔細閱讀API)。

感謝this post刷新我的記憶中。

+0

不錯的建議。 1+ –

+0

@HovercraftFullOfEels謝謝。我認爲,如果這是解決方案,那麼這個問題應該被標記爲我鏈接的一個重複。 – user1803551

+0

是'paintImmediately'重繪後'被稱爲()'或者它應該被稱爲手動像OBJ.paintImmediately(矩形r) –