全屏独家模式

原文: 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子句时,进入和退出全屏模式更加强大。这不仅是良好的编码实践,而且还会阻止您的程序保持全屏独占模式的时间长于它应该:

    1. GraphicsDevice myDevice;
    2. Window myWindow;
    3. try {
    4. myDevice.setFullScreenWindow(myWindow);
    5. ...
    6. } finally {
    7. myDevice.setFullScreenWindow(null);
    8. }
  • 大多数全屏独家应用程序更适合使用未装饰的窗户。使用setUndecorated方法关闭框架或对话框中的装饰。

  • 全屏独占应用程序不应调整大小,因为调整全屏应用程序的大小可能会导致不可预测(或可能危险)的行为。
  • 出于安全原因,在 applet 中使用全屏独占模式时,用户必须授予fullScreenExclusive权限。