本 Java 教程是针对 JDK 8 编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅 Java 语言更改,了解 Java SE 9 及后续版本中更新的语言特性的摘要。
请参阅 JDK 发行说明,了解有关所有 JDK 版本的新功能、增强功能以及已删除或已弃用选项的信息。
如前所述,大多数全屏应用程序在绘制时通常表现得更好。在传统的窗口化GUI应用程序中,绘制的时间通常由操作系统处理。在窗口化环境中,这是完全合理的。窗口应用程序不知道用户何时会移动、调整大小、显示或覆盖另一个窗口中的应用程序,直到实际发生这些情况。在Java GUI应用程序中,操作系统会向AWT发送一个绘制事件,AWT会确定需要绘制什么,创建一个带有适当剪辑区域的java.awt.Graphics对象,然后调用具有该Graphics对象的paint方法:
// 传统GUI应用程序的绘制方法: // 这个方法可以在任何时间调用,通常 // 是从事件分发线程调用的 public void paint(Graphics g) { // 使用g来绘制我的组件 }
这有时被称为被动渲染。可以想象,这样的系统会产生很多开销,这令许多对性能敏感的AWT和Swing程序员感到恼火。
当处于全屏独占模式时,你不再需要担心窗口被调整大小、移动、显示或遮挡(除非你忽略了我关闭调整大小的建议)。相反,应用程序窗口直接绘制到屏幕上(主动渲染)。这简化了绘制的过程,因为你不需要担心绘制事件。实际上,当处于全屏独占模式时,操作系统发送的绘制事件甚至可能在不适当或不可预测的时间传递。
在全屏独占模式下,通常更适合使用渲染循环来完成绘制代码:
public void myRenderingLoop() { while (!done) { Graphics myGraphics = getPaintGraphics(); // 使用myGraphics进行适当的绘制 myGraphics.dispose(); } }
这样的渲染循环可以在任何线程中完成,可以是自己的辅助线程,也可以是主应用程序线程的一部分。
关于使用主动渲染的一些提示: