我正在开发一个不适合常规应用程序配置文件的java swing应用程序。它包含一个选项卡式窗格(和其他一些面板),每个选项卡都包含一个具有活动渲染功能的画布(一次仅绘制一个线程)。
问题是,当我调整主应用程序窗口的大小时,画布内容不会显示(当我停止拖动鼠标时会显示它),我无法弄清楚原因。我还注意到一些教程将内容渲染为缓冲图像:
http://jamesgames.org/resources/double_buffer/double_buffering_and_active_rendering.html
这可能是Canvas闪烁的原因吗(我了解教程缓冲图像的方式仅用于移除标题栏偏移量)?
GUI的结构如下:
JFrame
- TabbedPane
- ScrollPane
- Canvas 1
- ScrollPane
- Canvas 2
- JPanel
- labels,buttons,..
代码:
class Renderer extends Canvas implements Runnable
{
Thread hThread = null;
BufferStrategy strategy = null;
Renderer()
{
setIgnoreRepaint(true);
}
public void run()
{
while(active)
{
g = strategy.getDrawGraphics();
draw(g); // renderer elements
strategy.show();
g.dispose();
}
}
// Called when switched to in Tabbed pane
public void start()
{
createBufferStrategy(2);
strategy = getBufferStrategy();
hThread = new Thread(this);
hThread.start();
}
// Called when switched off in Tabbed pane
public void stop(){
hThread.stop();
}
}
最佳答案
双重缓冲技术用于减少或消除快速绘制代码中的闪烁,这是您应该通过BufferStrategy(内部使用BufferedImage)完成的工作。
看起来这将使您朝正确的方向前进:AWT custom rendering - capture smooth resizes and eliminate resize flicker(编辑:此链接实际上无法解决“调整大小”问题)