我正在开发一个不适合普通应用程序配置文件的java swing应用程序。它包含一个选项卡式窗格(以及一些其他面板),每个选项卡包含一个带有活动渲染的Canvas(一次只绘制一个线程)。
问题在于,当我调整主应用程序窗口的大小时,画布内容不显示(当我停止拖动鼠标时显示)并且我无法确定原因。我还注意到一些教程将内容呈现为缓冲图像:
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();
}
}
答案 0 :(得分:1)
双缓冲技术用于减少或消除快速绘制代码中的闪烁,这是您应该通过BufferStrategy(内部使用BufferedImage)完成的。
看起来这会让你朝着正确的方向前进:AWT custom rendering - capture smooth resizes and eliminate resize flicker(编辑:此链接实际上无法解决调整大小问题)
答案 1 :(得分:1)
解决了我的问题。解决方案是删除JScrollPane并将其替换为JPanel。然后我将画布添加到JPanel并自己处理滚动(使用JScrollBar)。画布不再闪烁,并且调整大小也表现得更好。