JavaFX之切换界面视图(springboot)


前言:JavaFX启动后,如何进行界面的切换呢?,我们接着本专栏的 demo进行演示

一:创建另一个视图Main

main.fxml

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="com.xiyang.boot.controller.MainController"
            prefHeight="400.0" prefWidth="600.0" style="-fx-border-color: red;-fx-border-width: 1">
    <Button AnchorPane.topAnchor="100" text="你好"/>
</AnchorPane>

MainView

@FXMLView(value = "/fxml/main.fxml")
public class MainView extends AbstractFxmlView {
}

MainController

@FXMLController
public class MainController {
}

二:编写界面切换事件

界面切换在我看来有两种:

  1. 给定一个容器,替换其中的node
@FXMLController
public class LoginController implements Initializable {
    public Button button;
    public VBox vbox;
    @Autowired
    private MainView mainView;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        button.setOnAction(event -> {
            vbox.getChildren().addAll(mainView.getView());
            GUIState.getStage().setWidth(600);
            // 将舞台置于窗口中央
            GUIState.getStage().centerOnScreen();
        });
    }
}

效果
在这里插入图片描述
2. 替换场景(scene)
如springboot-javafx-support的showView源码

    public static void showView(final Class<? extends AbstractFxmlView> newView) {
        try {
            final AbstractFxmlView view = applicationContext.getBean(newView);

            if (GUIState.getScene() == null) {
                GUIState.setScene(new Scene(view.getView()));
            } else {
                GUIState.getScene().setRoot(view.getView());
            }
            GUIState.getStage().setScene(GUIState.getScene());

            applyEnvPropsToView();

            GUIState.getStage().getIcons().addAll(icons);
            GUIState.getStage().show();

        } catch (Throwable t) {
            LOGGER.error("Failed to load application: ", t);
            showErrorAlert(t);
        }
    }

保持当前单例舞台,只是替换场景
修改MainController

@FXMLController
public class LoginController implements Initializable {

    public Button button;
    public VBox vbox;

    @Autowired
    private MainView mainView;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        button.setOnAction(event -> {
//            vbox.getChildren().addAll(mainView.getView());
//            GUIState.getStage().setWidth(600);
//            // 将舞台置于窗口中央
//            GUIState.getStage().centerOnScreen();
            JavafxSpringboot4Application.showView(MainView.class);

        });
    }
}

效果
在这里插入图片描述

注意:不管你是否结合springboot,都应只用一个stage来保存场景,
界面切换时,也不建议关闭当前stage,再取开启另一个stage,这样耗费了性能

三:demo地址

demo地址

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值