# 如何创建启动画面

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/misc/splashscreen.html](https://docs.oracle.com/javase/tutorial/uiswing/misc/splashscreen.html)

几乎所有现代应用程序都有闪屏。通常，启动屏幕用于以下目的：

*   宣传产品
*   向用户指示应用程序在长启动期间启动
*   提供每次访问仅需一次的信息

Java 基础类，Swing 和抽象窗口工具包（AWT），使开发人员能够在 Java 技术应用程序中创建初始屏幕。但是，因为启动屏幕的主要目的是向用户提供有关应用程序启动的反馈，所以应用程序启动和启动屏幕弹出之间的延迟应该是最小的。在弹出启动屏幕之前，应用程序必须加载并初始化 Java™虚拟机（JVM），AWT，Swing 以及有时依赖于应用程序的库。由此产生的几秒钟延迟使得基于 Java™技术的闪屏不再令人满意。

幸运的是，Java™SE 6 提供了一种解决方案，允许应用程序更早地显示启动屏幕，甚至在虚拟机启动之前。 Java 应用程序启动器能够解码图像并在简单的非装饰窗口中显示它。

启动画面可以显示任何`gif`，`png`或`jpeg`图像，具有透明度，半透明度和动画效果。下图表示作为动画`gif`文件开发的 Java 应用程序初始屏幕的示例。

![Splash Screen for Java Application](img/e2d491d5f28ff0986ee26f1b2c2b1242.jpg)

[`SplashScreen`](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html) 类用于关闭启动画面，更改启动画面图像，获取图像位置或大小，以及在启动画面中绘画。应用程序无法创建此类的实例。只能在此类中创建单个实例，并且可以使用`getSplashScreen()`静态方法获取此实例。如果应用程序在启动时未通过命令行或清单文件选项创建启动屏幕，则`getSplashScreen`方法返回 null。

通常，开发人员希望将闪屏图像保留在屏幕上并在图像上显示某些内容。闪屏窗口具有带 alpha 通道的覆盖表面，可以使用传统的`Graphics2D`界面访问此表面。

以下代码段显示如何获取`SplashScreen`对象，然后如何使用`createGraphics()`方法创建图形上下文：

```
...
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }
        Graphics2D g = splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
...

```

在 [`SplashDemo.java`](../examples/misc/SplashDemoProject/src/misc/SplashDemo.java) 文件中找到演示的完整代码。

* * *

**Note:** 

SplashDemo 应用程序使用固定坐标显示叠加信息。这些坐标是图像相关的，并为每个闪屏单独计算。

* * *

可以通过以下方式显示本机启动画面：

*   命令行参数
*   带有指定清单选项的 Java™Archive（JAR）文件

要从命令行显示启动画面，请使用`-splash:`命令行参数。此参数是一个 Java 应用程序启动器选项，显示启动屏幕：

```
java -splash:<file name> <class name>

```

* * *

**Try this:** 

1.  编译 [``SplashDemo.java``](../examples/misc/SplashDemoProject/src/misc/SplashDemo.java)文件。
2.  将 [``splash.gif``](../examples/misc/SplashDemoProject/src/mihttps://docs.oracle.com/javase/tutorial/images/splash.gif)图像保存在`images`目录中。
3.  使用以下参数从命令行运行应用程序：

    ```
    java -splash:images/splash.gif SplashDemo

    ```

4.  等到启动画面完全显示。
5.  出现应用程序窗口。要关闭窗口，请从弹出菜单中选择“文件”|“退出”或单击“X”。
6.  将启动画面名称更改为不存在的图像，例如`nnn.gif`。运行应用程序如下：

    ```
    java -splash:images/nnn.gif SplashDemo

    ```

7.  您将看到以下输出字符串：

    ```
    SplashScreen.getSplashScreen() returned null

    ```

* * *

如果您的应用程序打包在 JAR 文件中，则可以使用清单文件中的`SplashScreen-Image`选项来显示启动画面。将图像放在 JAR 文件中，并在选项中指定路径，如下所示：

```
Manifest-Version: 1.0
Main-Class: <class name>
SplashScreen-Image: <image name>

```

* * *

**Try this:** 

1.  编译 [``SplashDemo.java``](../examples/misc/SplashDemoProject/src/misc/SplashDemo.java)文件。
2.  将 [``splash.gif``](../examples/misc/SplashDemoProject/src/mihttps://docs.oracle.com/javase/tutorial/images/splash.gif)图像保存在`images`目录中。
3.  按如下方式准备`splashmanifest.mf`文件：

    ```
    Manifest-Version: 1.0
    Main-Class: SplashDemo
    SplashScreen-Image: images/splash.gif

    ```

4.  使用以下命令创建 JAR 文件：

    ```
    jar cmf splashmanifest.mf splashDemo.jar SplashDemo*.class images/splash.gif

    ```

    有关 JAR 文件的更多信息，请参阅 JAR 文件页面的[打包程序中的](../../deployment/jar/index.html)[使用 JAR 文件](../../deployment/jar/basicsindex.html)。
5.  运行应用程序：

    ```
    java -jar splashDemo.jar

    ```

6.  等到启动画面完全显示。
7.  出现应用程序窗口。要关闭窗口，请从弹出菜单中选择“文件”|“退出”或单击“X”。

* * *

`SplashScreen`类不能用于创建启动画面。只能在此类中创建单个实例。

| 方法 | 目的 |
| :-- | :-- |
| [getSplashScreen（）](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html#getSplashScreen--) | 返回用于 Java 启动初始屏幕控制的`SplashScreen`对象。 |
| [createGraphics（）](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html#createGraphics--) | 为初始屏幕叠加图像创建图形上下文（作为`Graphics2D`对象），允许您在初始屏幕上绘图。 |
| [getBounds（）](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html#getBounds--) | 以`Rectangle`的形式返回闪屏窗口的边界。 |
| [close（）](https://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html#close--) | 关闭启动屏幕并释放所有相关资源。 |

下表列出了使用闪屏的示例。

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`SplashDemo`](../examples/misc/index.html#SplashDemo) | 这个部分 | 在打开应用程序窗口之前显示启动画面。 |