这样做是一种好习惯吗
不,这实际上非常可怕且容易出错。假设这是
Component#getGraphics方法。问题是Swing使用被动渲染算法,也就是说,Swing决定何时以及应重新绘画的对象,并且出于优化原因进行此操作。
这意味着更新不是定期的,这在制作动画时确实有帮助,并且可能由于多种原因随时发生,其中许多原因您根本无法控制。
由于这些原因,应该在一种绘画方法(最好
paintComponent是
JComponent基于基础的绘画方法)内进行绘画。这样,当Swing决定进行重新绘制时,一个就知道并且可以相应地更新输出,而第二个就不会清除以前使用
getGraphics它绘制的内容,这可能导致闪烁…
您还遇到了潜在的线程问题,因为您试图在
Graphics上下文中绘制,所以事件调度线程可能不会结束,所有绘制都应在EDT上下文中完成。
(用于基于组件的绘画)
您可以尝试使用
BufferedStrategy,这样可以直接控制绘画过程,但这将您限制在AWT库中。不知道这对您而言是好是坏。
另一件事,graphic.dispose()如何正常工作?,因为尝试删除此行代码,因此没有任何反应。
dispose基本上释放
Graphics上下文可能拥有的任何本机资源。一般的经验法则,如果没有创建,就不要丢弃它。
因此,如果使用
Graphics#create或
BufferedImage#createGraphics获取
Graphics上下文,则
dispose在完成操作后应调用。
在某些系统
dispose上,调用
Grpahics用于执行组件绘制(例如传递给
paintComponent或从中获得的组件)的上下文
getGraphcis可能会阻止进一步的内容被绘制。
同样,不处理
Graphics您创建的上下文会导致内存泄漏,因为它们不会收集垃圾。



