2010-08-11 45 views
1

我正在編寫一個小部件,它會執行一些緩存操作,以避免在每次重繪時對Shape.draw進行不必要的調用。BufferedImage imageType in swing

我一直試圖做這樣的事情(Scala代碼):

private val buffer = new BufferedImage(width, height, /* (1) */) 
... 
override def paintComponent(Graphics2D g) = { 
    if (hasChanged) { 
    val bg = buffer.getGraphics.asInstanceOf[Graphics2D] 
    bg.draw(/* ... */) 
    buffer.flush 
    } 
    g.drawImage(buffer, null /* (2) */, 0, 0) 
} 

我不知道要放什麼東西在(1)(2)。 (2)的null似乎工作(我不想改造)。但對於(1)我不知道要選擇哪種圖像類型。有沒有在運行時要求「正確」的方法?

+2

取決於 - 你需要緩衝的圖像是透明的嗎?如果沒有,BufferedImage.TYPE_INT_RGB可能沒問題。 您可能還想創建一個「兼容」圖像。參見'BufferedImage img = g.getDeviceConfiguration()。createCompatibleImage( width,height,Transparency.OPAQUE);' 其中g是Graphics2D的一個實例 – Tedil 2010-08-11 14:05:53

+0

我嘗試過不同的圖像類型,其中TYPE_INT_RGB,但我最多隻能得到黑白圖像。用CompatibleImage,我得到一個黑色的圖像。 [編輯]用TYPE_INT_ARGB我得到一個豐富多彩的圖像,但這將在每個平臺上都是一樣的嗎? – 2010-08-11 14:17:27

+0

它也適用於'createCompatibleImage',但是「setBackground」沒有繪製背景,所以我認爲它是黑色的,謝謝! – 2010-08-11 14:23:52

回答

1

正如Tedil指出的那樣,g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.OPAQUE)有訣竅。