Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
如前所述,大多数全屏应用程序通常在绘图过程中掌控时效果更好。在传统的窗口 GUI 应用程序中,何时绘制的问题通常由操作系统处理。在窗口环境中操作时,这非常有意义。窗口化应用程序不知道用户何时将其他窗口移动,调整大小,公开或覆盖应用程序,直到实际发生。在 Java GUI 应用程序中,操作系统向 AWT 提供 paint event (绘制事件),其中指出需要绘制的内容,创建一个 java.awt.Graphics 对象。适当的剪切区域,然后使用 Graphics 对象调用 paint 方法:
// Traditional GUI Application paint method: // This can be called at any time, usually // from the event dispatch thread public void paint(Graphics g) { // Use g to draw my Component }
这有时被称为 passive rendering (被动渲染)。可以想象,这样的系统会产生很多开销,这对很多对性能敏感的 AWT 和 Swing 程序员来说都很烦人。
在全屏独占模式下,你不必再担心窗口被调整大小,移动,暴露或遮挡(除非你忽略了我关闭调整大小的建议)。而是将应用程序窗口直接绘制到屏幕上(active rendering (主动渲染))。这简化了绘画,因为你不需要担心绘画事件。实际上,当处于全屏独占模式时,操作系统提供的绘制事件甚至可能在不适当或不可预测的时间传递。
在全屏独占模式下,绘图代码通常更适合在 rendering loop (渲染循环) 中完成,而不是依赖于 paint 方法:
public void myRenderingLoop() { while (!done) { Graphics myGraphics = getPaintGraphics(); // Draw as appropriate using myGraphics myGraphics.dispose(); } }
这样的渲染循环可以从任何线程完成,可以是自己的辅助线程,也可以是主应用程序线程的一部分。
有关使用主动渲染的一些提示: