我正在开发一个不适合常规应用程序配置文件的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(编辑:此链接实际上无法解决“调整大小”问题)

07-28 03:19
查看更多