我正在编写一个程序,该程序涉及覆盖 JPanel 来完成一些图形工作。基本上,这个 JPanel 显示了一个六边形字段,用户可以与单个单元格进行交互。这个字段可能由成百上千个六边形组成,并且大多数时候发生变化时,只有屏幕的一小部分受到影响。但同时,它使用多个层(有一个“主”层显示单元格包含的内容,以及一个显示哪些单元格已被选中并准备修改的叠加层)
为了避免在任何时候需要重绘时渲染每个单元格的成本,我的应用程序目前存在的每个层都保存一个 BufferedImage。当调用 paintComponent() 时,应用程序会检查是否已进行任何需要绘制的更改(例如,用户单击屏幕,因此覆盖层需要显示某些单元格已被选中),如果是,则将修改后的图层渲染为其缓冲图像。在任何一种情况下,重绘都会将两个 BufferedImage 都传送到屏幕上。
它工作得很好,但这基本上是双缓冲的家庭旋转版本,Swing 应该在内部支持它。但是,对于我的生活,我似乎无法找到访问组件后备缓冲区的位置以便我可以修改它......如果我在 JPanel 上调用“getGraphics()”,我会得到空指针异常 - - 所以这是不行的。
我正在寻找一种更优雅优雅的方式来做到这一点,它希望利用 swing 提供的内置双缓冲,以避免仅仅为了一个微小的变化而对整个屏幕进行 blitting(并且避免不得不重新发明剪辑)。
有任何想法吗?