JavaFX實(shí)現(xiàn)界面跳轉(zhuǎn)
界面跳轉(zhuǎn),很常見(jiàn)的一個(gè)功能,在桌面程序中,可以多窗口跳轉(zhuǎn),也可以在一個(gè)窗口中跳轉(zhuǎn)。不同方式對(duì)應(yīng)不同場(chǎng)景。下面簡(jiǎn)單介紹一下,JavaFX中單窗口界面跳轉(zhuǎn)方式。
BorderPane 跳轉(zhuǎn)
利用BorderPane的setCenter重新設(shè)置中心節(jié)點(diǎn)進(jìn)行界面跳轉(zhuǎn)。
好處是其他區(qū)域的節(jié)點(diǎn)不會(huì)更新,只會(huì)更新center中的節(jié)點(diǎn),并且可以控制是每個(gè)頁(yè)面是否可以重新加載,方便。
scene節(jié)點(diǎn)如下,在BorderPane的top中設(shè)置按鈕事件,更新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="首頁(yè)" onAction="#toHome" /> ? ? ? ? ? ? ? ? ? <Button mnemonicParsing="false" text="文件" onAction="#toFile"/> ? ? ? ? ? ? ? ? ? <Button mnemonicParsing="false" text="設(shè)置" 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跳轉(zhuǎn)
StackPane也是JavaFX中的一個(gè)面板容器,特點(diǎn)是里面的元素是堆疊在一起的,每次只顯示最上層元素。利用這個(gè)特點(diǎn),可以把多個(gè)界面加載之后作為StackPane的字節(jié)的,然后調(diào)整StackPane的頂層元素即可。
這種方法比較適合每個(gè)頁(yè)面跳轉(zhuǎn)時(shí)不需要重新加載的情況,效率比較高,只是改變字節(jié)點(diǎn)的順序。
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="首頁(yè)" /> ? ? ? ? ?<Button mnemonicParsing="false" onAction="#toFile" text="文件" /> ? ? ? ? ?<Button mnemonicParsing="false" onAction="#toSetting" text="設(shè)置" /> ? ? ? </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(); ? ? } }
三個(gè)界面的fxml如下:
首頁(yè)
<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="首頁(yè)" 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>
設(shè)置
<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="設(shè)置" 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>
其他跳轉(zhuǎn)方式,比如重新設(shè)置scene,這就相當(dāng)于重新加載當(dāng)前窗口,如非必要還是不推薦。上面兩種方式都是操作的容器里面的節(jié)點(diǎn)。實(shí)現(xiàn)了視覺(jué)上的界面跳轉(zhuǎn)。所以不局限于BorderPane和StackPane,只是這兩個(gè)容器用起來(lái)比較方便。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解
這篇文章主要介紹了Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解,類加載器是Java虛擬機(jī)(JVM)的一個(gè)重要組成部分,它的主要作用是將類的字節(jié)碼加載到內(nèi)存中,并生成對(duì)應(yīng)的Class對(duì)象,需要的朋友可以參考下2023-07-07Java用freemarker導(dǎo)出word實(shí)用示例
本篇文章主要介紹了Java用freemarker導(dǎo)出word實(shí)用示例,使用freemarker的模板來(lái)實(shí)現(xiàn)功能,有需要的可以了解一下。2016-11-11SpringDataJpa如何使用union多表分頁(yè)條件查詢
這篇文章主要介紹了SpringDataJpa如何使用union多表分頁(yè)條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02教你怎么用java一鍵自動(dòng)生成數(shù)據(jù)庫(kù)文檔
最近小編也在找這樣的插件,就是不想寫文檔了,浪費(fèi)時(shí)間和心情啊,果然我找到一款比較好用,操作簡(jiǎn)單不復(fù)雜.screw 是一個(gè)簡(jiǎn)潔好用的數(shù)據(jù)庫(kù)表結(jié)構(gòu)文檔的生成工具,支持 MySQL、Oracle、PostgreSQL 等主流的關(guān)系數(shù)據(jù)庫(kù).需要的朋友可以參考下2021-05-05淺談基于Token的WEB后臺(tái)認(rèn)證機(jī)制
這篇文章主要介紹了淺談基于Token的WEB后臺(tái)認(rèn)證機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12spring-data-jpa中findOne與getOne的區(qū)別說(shuō)明
這篇文章主要介紹了spring-data-jpa中findOne與getOne的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot?如何將項(xiàng)目打包成?jar?包
這篇文章主要介紹了SpringBoot如何將項(xiàng)目打包成jar包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法
這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01