JavaFX实现界面跳转

 更新时间:2022年06月16日 16:36:58   作者:西子~  
这篇文章主要为大家详细介绍了JavaFX实现界面跳转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

界面跳转,很常见的一个功能,在桌面程序中,可以多窗口跳转,也可以在一个窗口中跳转。不同方式对应不同场景。下面简单介绍一下,JavaFX中单窗口界面跳转方式。

BorderPane 跳转

利用BorderPane的setCenter重新设置中心节点进行界面跳转。

好处是其他区域的节点不会更新,只会更新center中的节点,并且可以控制是每个页面是否可以重新加载,方便。

scene节点如下,在BorderPane的top中设置按钮事件,更新center。

fxml

<BorderPane prefHeight="200.0" prefWidth="200.0" fx:id="container">
         <top>
            <HBox alignment="CENTER" spacing="20.0" BorderPane.alignment="CENTER">
               <children>
                  <Button mnemonicParsing="false" text="首页" onAction="#toHome" />
                  <Button mnemonicParsing="false" text="文件" onAction="#toFile"/>
                  <Button mnemonicParsing="false" text="设置" onAction="#toSetting"/>
               </children>
               <padding>
                  <Insets bottom="10.0" top="10.0" />
               </padding>
            </HBox>
         </top>
         <center>
  </center>
</BorderPane>

controller

public class JumpController {

    public BorderPane container;

    public void initialize() {
        URL resource = getClass().getResource("/fxml/jump/home.fxml");
        try {
            setCenter(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void setCenter(URL url) throws IOException {
        FXMLLoader loader = new FXMLLoader(url);
        loader.load();
        Parent root = loader.getRoot();
        container.setCenter(root);
    }

    public void toHome(ActionEvent event) {
        URL resource = getClass().getResource("/fxml/jump/home.fxml");
        try {
            setCenter(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void toFile(ActionEvent event) {
        URL resource = getClass().getResource("/fxml/jump/file.fxml");
        try {
            setCenter(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void toSetting(ActionEvent event) {
        URL resource = getClass().getResource("/fxml/jump/setting.fxml");
        try {
            setCenter(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

StackPane跳转

StackPane也是JavaFX中的一个面板容器,特点是里面的元素是堆叠在一起的,每次只显示最上层元素。利用这个特点,可以把多个界面加载之后作为StackPane的字节的,然后调整StackPane的顶层元素即可。

这种方法比较适合每个页面跳转时不需要重新加载的情况,效率比较高,只是改变字节点的顺序。

fxml

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="529.0" prefWidth="785.0"
      xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="xyz.yuelai.controller.Jump1Controller">
   <HBox alignment="CENTER" spacing="20.0">
      <children>
         <Button mnemonicParsing="false" onAction="#toHome" text="首页" />
         <Button mnemonicParsing="false" onAction="#toFile" text="文件" />
         <Button mnemonicParsing="false" onAction="#toSetting" text="设置" />
      </children>
      <padding>
         <Insets bottom="10.0" top="10.0" />
      </padding>
   </HBox>
   <StackPane prefHeight="150.0" prefWidth="200.0" VBox.vgrow="ALWAYS" fx:id="container" />

</VBox>

controller

public class Jump1Controller {

    public StackPane container;
    private Parent home;
    private Parent file;
    private Parent setting;

    public void initialize() {
        try {
            URL homeUrl = getClass().getResource("/fxml/jump/home.fxml");
            home = getParent(homeUrl);
            URL fileUrl = getClass().getResource("/fxml/jump/file.fxml");
            file = getParent(fileUrl);
            URL settingUrl = getClass().getResource("/fxml/jump/setting.fxml");
            setting = getParent(settingUrl);

            container.getChildren().addAll(setting, file, home);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Parent getParent(URL url) throws IOException {
        FXMLLoader loader = new FXMLLoader(url);
        return loader.load();
    }

    public void toHome(ActionEvent event) {
        home.toFront();
    }

    public void toFile(ActionEvent event) {
        file.toFront();
    }

    public void toSetting(ActionEvent event) {
        setting.toFront();
    }
}

三个界面的fxml如下:

首页

<AnchorPane prefHeight="460.0" prefWidth="781.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label alignment="CENTER" layoutX="297.0" layoutY="131.0" prefHeight="110.0" prefWidth="129.0" style="-fx-background-color: #a00;" text="首页" textFill="WHITE" AnchorPane.leftAnchor="200.0" AnchorPane.rightAnchor="200.0" AnchorPane.topAnchor="100.0">
         <font>
            <Font name="System Bold" size="20.0" />
         </font>
      </Label>
   </children>
</AnchorPane>

文件

<AnchorPane prefHeight="460.0" prefWidth="781.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Label alignment="CENTER" layoutX="297.0" layoutY="131.0" prefHeight="110.0" prefWidth="129.0" style="-fx-background-color: #0a0;" text="文件" textFill="WHITE" AnchorPane.leftAnchor="200.0" AnchorPane.rightAnchor="200.0" AnchorPane.topAnchor="100.0">
            <font>
                <Font name="System Bold" size="20.0" />
            </font>
        </Label>
    </children>
</AnchorPane>

设置

<AnchorPane prefHeight="460.0" prefWidth="781.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Label alignment="CENTER" layoutX="297.0" layoutY="131.0" prefHeight="110.0" prefWidth="129.0" style="-fx-background-color: #00a;" text="设置" textFill="WHITE" AnchorPane.leftAnchor="200.0" AnchorPane.rightAnchor="200.0" AnchorPane.topAnchor="100.0">
            <font>
                <Font name="System Bold" size="20.0" />
            </font>
        </Label>
    </children>
</AnchorPane>

其他跳转方式,比如重新设置scene,这就相当于重新加载当前窗口,如非必要还是不推荐。上面两种方式都是操作的容器里面的节点。实现了视觉上的界面跳转。所以不局限于BorderPane和StackPane,只是这两个容器用起来比较方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot使用AOP统一日志管理的方法详解

    SpringBoot使用AOP统一日志管理的方法详解

    这篇文章主要为大家分享一个干货:超简洁SpringBoot使用AOP统一日志管理,文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起学习学习吧
    2022-05-05
  • Lambda表达式的使用及注意事项

    Lambda表达式的使用及注意事项

    这篇文章主要介绍了Lambda表达式的使用及注意事项,主要围绕 Lambda表达式的省略模式 Lambda表达式和匿名内部类的区别的相关内容展开详情,感兴趣的小伙伴可以参考一下
    2022-06-06
  • SpringBoot启动时如何通过启动参数指定logback的位置

    SpringBoot启动时如何通过启动参数指定logback的位置

    这篇文章主要介绍了SpringBoot启动时如何通过启动参数指定logback的位置,在spring boot中,使用logback配置的方式常用的有两种,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Kafka中使用Avro序列化和反序列化详解

    Kafka中使用Avro序列化和反序列化详解

    这篇文章主要介绍了Kafka中使用Avro序列化和反序列化详解,由于Kafka中的数据都是字节数组,在将消息发送到Kafka之前需要先将数据序列化为字节数组, 序列化器的作用就是用于序列化要发送的消息的,需要的朋友可以参考下
    2023-12-12
  • Spring使用@Autowired注解静态实例对象方式

    Spring使用@Autowired注解静态实例对象方式

    这篇文章主要介绍了Spring使用@Autowired注解静态实例对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java实现根据模板读取PDF并替换指定内容

    Java实现根据模板读取PDF并替换指定内容

    在实际开发里,经常会遇到需要根据 PDF 模板文档生成特定 PDF 的需求,本文将利用Java中的iText实现读取 PDF 模板文档并替换指定内容,最后重新生成新PDF,感兴趣的可以了解下
    2025-02-02
  • Java获取支付宝OpenID的实现方法

    Java获取支付宝OpenID的实现方法

    在Java中,通过支付宝开放平台API可以获取用户的OpenID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Springboot Cucumber测试配置介绍详解

    Springboot Cucumber测试配置介绍详解

    这篇文章主要介绍了Springboot Cucumber测试配置介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java设计模式以虹猫蓝兔的故事讲解适配器模式

    Java设计模式以虹猫蓝兔的故事讲解适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
    2022-04-04
  • mybatis升级mybatis-plus时踩到的一些坑

    mybatis升级mybatis-plus时踩到的一些坑

    这篇文章主要给大家介绍了关于mybatis升级mybatis-plus时踩到的一些坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论