全屏独家模式
原文: https://docs.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html
使用 Microsoft DirectX API 的程序员可能已经熟悉全屏独占模式。其他程序员可能对这个概念有些新意。在任何一种情况下,全屏独占模式都是 J2SE™1.4 版的强大功能,它允许程序员暂停窗口系统,以便可以直接在屏幕上完成绘图。
这在很多方面都与通常的 GUI 程序略有不同。在传统的 Java GUI 程序中,AWT 负责从操作系统,事件调度线程传播绘制事件,并调用 AWT 的Component.paint
方法适当时。在全屏独家应用中,绘画通常由程序本身主动完成。另外,传统的 GUI 应用程序仅限于用户选择的屏幕的位深度和大小。在全屏独占应用程序中,程序可以控制屏幕的位深度和大小(显示模式)。最后,许多更先进的技术,例如页面翻转(下面讨论)和立体缓冲(利用为每只眼睛使用一组独立帧的系统)在某些平台上需要应用程序首先进入全屏独家模式。
硬件加速图像基础
要了解全屏独占模式 API,您需要了解硬件加速图像的一些基本原理。 VolatileImage
接口封装了可能会或可能不会利用硬件加速的表面。这些表面可能在操作系统的命令下失去其硬件加速或其内存(因此,名称为“volatile”)。有关易失性图像的更多信息,请参见VolatileImage
_ 教程*(即将推出)。
全屏独占模式通过java.awt.GraphicsDevice
对象处理。有关所有可用屏幕图形设备的列表(在单监视器系统或多监视器系统中),您可以在本地java.awt.GraphicsEnvironment
上调用方法getScreenDevices
;对于默认(主)屏幕(单监视器系统上的唯一屏幕),您可以调用方法getDefaultScreenDevice
。
拥有图形设备后,可以调用以下方法之一:
public boolean isFullScreenSupported()
此方法返回是否可以使用全屏独占模式。在没有全屏独占模式的系统上,最好以固定大小的窗口模式运行应用程序,而不是设置全屏窗口。public void setFullScreenWindow(Window w)
给定一个窗口,此方法使用该窗口进入全屏独占模式。如果没有全屏独占模式,则窗口位于(0,0)并调整大小以适合屏幕。将此方法与null
参数一起使用可退出全屏独占模式。
编程技巧
以下是有关使用全屏独占模式进行编程的一些提示:
- 在进入全屏独占模式之前,请检查
isFullScreenSupported
。如果不支持,性能可能会降低。 使用
try ... finally
子句时,进入和退出全屏模式更加强大。这不仅是良好的编码实践,而且还会阻止您的程序保持全屏独占模式的时间长于它应该:GraphicsDevice myDevice;
Window myWindow;
try {
myDevice.setFullScreenWindow(myWindow);
...
} finally {
myDevice.setFullScreenWindow(null);
}
大多数全屏独家应用程序更适合使用未装饰的窗户。使用
setUndecorated
方法关闭框架或对话框中的装饰。- 全屏独占应用程序不应调整大小,因为调整全屏应用程序的大小可能会导致不可预测(或可能危险)的行为。
- 出于安全原因,在 applet 中使用全屏独占模式时,用户必须授予
fullScreenExclusive
权限。