上一篇
在Java中制作启动界面可通过两种方式实现:一是使用
Java 6+内置的SplashScreen类,通过JVM参数指定启动图自动显示;二是手动创建Swing/JFX无边框窗口,加载图片后定时关闭并跳转主界面。
在Java中创建启动界面(Splash Screen)能提升用户体验,常见方法包括原生API、Swing窗口和JavaFX,以下是详细实现方案:
使用Java原生SplashScreen(推荐)
适用场景:Java 6+桌面应用,需在JVM启动时立即显示
步骤:
-
创建图片
准备PNG/JPG/GIF图片(如splash.jpg),放在项目resources目录。 -
配置MANIFEST.MF
在MANIFEST.MF中添加路径(需打包为JAR):
Manifest-Version: 1.0 SplashScreen-Image: resources/splash.jpg
-
代码控制显示时长
import javax.swing.*; import java.awt.*; public class MainApp { public static void main(String[] args) { // 获取启动界面实例 final SplashScreen splash = SplashScreen.getSplashScreen(); if (splash != null) { try { // 显示3秒 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } splash.close(); } // 启动主程序 SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("主窗口"); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
使用Swing窗口模拟
适用场景:需要动态内容(进度条、文本)
实现代码:
public class SwingSplash {
public static void main(String[] args) {
JWindow splash = new JWindow();
splash.setSize(400, 300);
splash.setLocationRelativeTo(null); // 居中
// 添加图片和进度条
JLabel image = new JLabel(new ImageIcon("resources/splash.png"));
JProgressBar progress = new JProgressBar(0, 100);
progress.setStringPainted(true); // 显示百分比
splash.add(image, BorderLayout.CENTER);
splash.add(progress, BorderLayout.SOUTH);
splash.setVisible(true);
// 模拟加载
for (int i = 0; i <= 100; i++) {
progress.setValue(i);
try {
Thread.sleep(30); // 控制进度速度
} catch (InterruptedException e) {
e.printStackTrace();
}
}
splash.dispose(); // 关闭启动界面
new MainApp(); // 打开主程序
}
}
JavaFX启动界面
适用场景:JavaFX应用
实现代码:

public class JavaFXSplash extends Application {
@Override
public void start(Stage primaryStage) {
// 启动界面
StackPane splashRoot = new StackPane();
splashRoot.getChildren().add(new ImageView(new Image("file:splash.png")));
Scene splashScene = new Scene(splashRoot, 400, 300);
Stage splashStage = new Stage();
splashStage.initStyle(StageStyle.UNDECORATED); // 隐藏标题栏
splashStage.setScene(splashScene);
splashStage.show();
// 模拟加载后切换主界面
PauseTransition delay = new PauseTransition(Duration.seconds(3));
delay.setOnFinished(e -> {
splashStage.close();
showMainWindow(primaryStage); // 显示主窗口
});
delay.play();
}
private void showMainWindow(Stage stage) {
stage.setTitle("主窗口");
stage.setScene(new Scene(new VBox(new Label("欢迎使用")), 800, 600));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
关键注意事项
-
图片规范
- 格式:PNG(支持透明通道)
- 尺寸:不超过屏幕分辨率50%
- 大小:压缩至200KB内避免卡顿
-
线程安全
- Swing组件在
EventQueue中操作:SwingUtilities.invokeLater(() -> progress.setValue(i));
- JavaFX在
Platform.runLater()中更新UI
- Swing组件在
-
跨平台兼容
- 路径使用分隔符(
resources/splash.png) - 测试不同系统字体渲染差异
- 路径使用分隔符(
-
用户体验优化

- 显示进度反馈(进度条/百分比)
- 超时处理(最长10秒自动关闭)
- 加载失败时提供错误提示
方案对比
| 方法 | 启动速度 | 功能灵活性 | 适用项目 |
|---|---|---|---|
| 原生SplashScreen | ️ 极快 | 标准Swing应用 | |
| Swing窗口 | |||
| JavaFX | JavaFX应用 |
最佳实践:
- 轻量级工具选择原生API
- 复杂应用用Swing窗口添加进度控制
- 避免阻塞事件调度线程(EDT)
引用说明:
- Oracle官方文档 SplashScreen类
- JavaFX场景图设计 OpenJFX指南
- Swing线程规范 Oracle并发指南
