# 全屏独家模式

> 原文： [https://docs.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html](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` 权限。