Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 利用Swing双缓冲_Java_Swing_Doublebuffered - Fatal编程技术网

Java 利用Swing双缓冲

Java 利用Swing双缓冲,java,swing,doublebuffered,Java,Swing,Doublebuffered,我正在编写一个程序,其中涉及重写JPanel以进行一些图形工作。基本上,这个JPanel显示一个六边形区域,用户可以与单个单元格交互。此字段可能由数百或数千个六边形组成,大多数情况下,当发生更改时,只有屏幕的一小部分受到影响。但同时,它使用了多个层,一个主层显示单元格包含的内容,另一个覆盖层显示已选择并准备修改的单元格 为了避免在需要重新绘制时渲染每个单元格的成本,我的应用程序当前为每个层保存一个BuffereImage。调用paintComponent时,应用程序会检查是否进行了任何需要绘制的

我正在编写一个程序,其中涉及重写JPanel以进行一些图形工作。基本上,这个JPanel显示一个六边形区域,用户可以与单个单元格交互。此字段可能由数百或数千个六边形组成,大多数情况下,当发生更改时,只有屏幕的一小部分受到影响。但同时,它使用了多个层,一个主层显示单元格包含的内容,另一个覆盖层显示已选择并准备修改的单元格

为了避免在需要重新绘制时渲染每个单元格的成本,我的应用程序当前为每个层保存一个BuffereImage。调用paintComponent时,应用程序会检查是否进行了任何需要绘制的更改,例如,用户在屏幕上单击,因此覆盖需要显示某些单元格已选中,如果是,则将修改的层渲染到其BuffereImage。在这两种情况下,重新绘制只会将两个BuffereImages点显到屏幕上

它工作得很好,但这基本上是一个双缓冲的家用版本,Swing应该在内部支持它。然而,在我的一生中,我似乎找不到哪里可以访问组件的备份缓冲区,以便修改它。。。如果我在JPanel上调用getGraphics,就会出现空指针异常——所以这是不可能的

我正在寻找一种更优雅的方式来实现这一点,希望它能利用swing提供的内置双缓冲功能,以避免仅仅为了一个微小的改变而突然打开整个屏幕,并避免重新创建剪辑


有什么想法吗?

你所做的是合理有效的。我不会担心试图进入组件备份缓冲区。你可以看看创建一个已经改变的区域的子图像,然后简单地画出来。是的,我唯一的另一个想法是存储一个区域,该区域跟踪已更改的区域,然后将剪辑设置为该区域,然后依靠神秘的备份缓冲区跟踪未更改的区域。。。我只是不想做的工作,如果有一个更简单的方式,我看不到有。。。谢谢你的建议不要弄乱组件的剪辑矩形,它会把你弄翻的:P