1

我正在开发一个不适合正常应用程序配置文件的 java swing 应用程序。它包含一个选项卡式窗格(和一些其他面板),每个选项卡都包含一个带有活动渲染的画布(一次只有一个线程绘制)。

问题是,当我调整主应用程序窗口的大小时,画布内容不显示(当我停止拖动鼠标时它显示出来),我不知道为什么。我还注意到一些教程将内容呈现为缓冲图像:

http://jamesgames.org/resources/double_buffer/double_buffering_and_active_rendering.html

这可能是画布闪烁的原因(我理解教程缓冲图像的方式仅用于删除标题栏偏移)?

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();
   }

} 
4

2 回答 2

1

双缓冲技术用于减少或消除快速绘制代码中的闪烁,这是您应该通过 BufferStrategy 完成的(内部使用 BufferedImage)。

看起来这会让您朝着正确的方向前进:AWT 自定义渲染 - 捕获平滑调整大小并消除调整大小闪烁 (编辑:此链接实际上并不能解决调整大小问题)

于 2012-04-23T20:32:01.790 回答
1

解决了我的问题。解决方案是删除 JScrollPane 并将其替换为 JPanel。然后我将画布添加到 JPanel 并自己处理滚动(使用 JScrollBar)。画布不再闪烁,调整大小的效果也更好。

于 2012-05-04T14:04:07.433 回答