我不太确定该如何表达,所以请耐心等待。
我在容器 JPanel
中有两个 JPanel
和一个 OverlayLayout
。容器中的两个 JPanel
都会覆盖 paint(Graphics)
.
底部的 JPanel
是不透明的,绘制了一些相当复杂的图形,因此需要“很长”的时间(10 或 100 毫秒)来呈现。
顶部的 JPanel
是透明的,只是根据鼠标输入绘制一个矩形或直线或简单的形状,所以速度非常快。
有没有一种方法可以设置当我更改上面板中的简单形状时,它不会重绘底部面板?(例如它以某种方式缓存底部面板) p>
我对 bitblt、双缓冲和 XOR 绘图等概念有点熟悉,但不确定在此处应用什么。
最佳答案
最好使用单个 JComponent
并创建一个 BufferedImage
来存储底部图像。当 paintComponent
操作发生在 JComponent
上时,您只需 blit 底部图像并使用 Graphics
对象在其上做任何进一步的绘制(从存储状态)。应该相当有效。
您需要在另一个线程中为底部的 BufferedImage
执行复杂的绘制操作,正如其他张贴者所提到的(不小心忽略了这一点,抱歉 :))。但是,您不想引起对该图像的争用,因此您必须为此存储一个额外的 BufferedImage
,并在绘制操作完成的那一刻将它同步到另一个图像.
关于java+Swing : efficient overlay of rectangle or other "sprite",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144232/