2010-08-11 1 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). null для (2), кажется, работает (я не хочу преобразований). Но для (1) я понятия не имею, какой тип изображения выбрать. Есть ли способ попросить «правильный» один во время выполнения?

+2

зависит - вам нужно, чтобы буферизованное изображение было прозрачным? если нет, BufferedImage.TYPE_INT_RGB может быть в порядке. Вы также можете создать «совместимое» изображение. См. «BufferedImage img = g.getDeviceConfiguration(). CreateCompatibleImage ( width, height, Transparency.OPAQUE); где g - экземпляр Graphics2D – Tedil

+0

Я пробовал разные типы изображений, среди них TYPE_INT_RGB, но я получаю в лучшем случае черно-белое изображение. С CompatibleImage я получаю черное изображение. [EDIT] С TYPE_INT_ARGB Я получаю красочное изображение, но будет ли оно одинаковым на каждой платформе? –

+0

Он также работает с 'createCompatibleImage', но« setBackground »не рисовал фон, поэтому я думал, что он черный, спасибо! –

ответ

1

Как указал Тедиль, g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.OPAQUE) делает трюк.