Hello,大家好,我是78KgMiao。
场景分析
当我们做一款成熟的客户端软件时,一般会在软件打开之前进行一些初始化操作。比如:初始化目录
、初始化系统配置
、版本检测
等。
这时就需要一个软件启动页来过渡场景的切换,在启动页展示产品的设计理念,同时在后台进行软件初始化操作。
Eclipse简直不要太爽。
运行效果
代码案例
package mqx;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;
/**
* 启动页案例
*
* @author Miaoqx
*/
public class Loading extends Application {
private static Label infoLb;
@Override
public void start(Stage stage) throws Exception {
Image image = new Image("https://img-blog.csdnimg.cn/20200927152800323.png");
ImageView view = new ImageView(image);
infoLb = new Label();
infoLb.setTextFill(Color.WHITE);
AnchorPane.setRightAnchor(infoLb, 10.0);
AnchorPane.setBottomAnchor(infoLb, 10.0);
AnchorPane page = new AnchorPane();
page.getChildren().addAll(view, infoLb);
stage.setTitle("eclipse");
stage.setScene(new Scene(page));
stage.setWidth(image.getWidth());
stage.setHeight(image.getHeight());
stage.initStyle(StageStyle.UNDECORATED);
stage.getIcons().add(new Image("https://img-blog.csdnimg.cn/20200927163943686.png"));
stage.show();
// 核心代码
new Thread(() -> {
initSystem();// 1
Platform.runLater(() -> {// 2
try {
Home home = new Home();
home.addEventHandler(WindowEvent.WINDOW_SHOWN, event -> {
stage.hide();
});
home.show();
} catch (Throwable e) {
e.printStackTrace();// 3
}
});
}).start();
}
// 初始化系统
private void initSystem() {
try {
showInfo("初始化目录...");
Thread.sleep(1500);
showInfo("初始化系统配置...");
Thread.sleep(1500);
showInfo("版本检测...");
Thread.sleep(1500);
} catch (Throwable e) {
e.printStackTrace();
}
}
// 显示信息
public static void showInfo(String info) {
Platform.runLater(() -> infoLb.setText(info));
}
/**
* 主页
*
* @author Miaoqx
*/
public class Home extends Stage {
public Home() {
Pane pane = new Pane();
pane.getChildren().add(new Label("Hello, I'm 78KgMiao."));
setScene(new Scene(pane));
setTitle("Home");
setMaximized(true);
getIcons().add(new Image("https://img-blog.csdnimg.cn/20200927163943686.png"));
}
}
public static void main(String[] args) {
launch(args);
}
}
代码解析
- 注释
1
:在启动页打开后。开启新线程,进行软件初始化从操作。期间可以调用Loading.showInfo()
方法刷新启动信息或者启动进度。- 注释
2
:在初始化操作完成后。打开主页。这里并没有直接关闭启动页,而是给主页添加WindowEvent.WINDOW_SHOWN
事件,在主页显示完成后再关闭启动页。- 注释
3
:用于处理异常。如果主页打开失败,是否需要退出软件,或者执行其他操作。