主要分为两种情况

  1. 从一个界面跳转到另外一个新的界面
  2. 在原有界面上加载其他页面。类似iframe

先从第一个情况的实现说起。

页面跳转

1. 创建一个登录界面

<?xml version="1.0" encoding="UTF-8"?><?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?><AnchorPane fx:id="login" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.view.login.LoginController"><children><BorderPane prefHeight="20.0" prefWidth="600.0" /><Label layoutX="99.0" layoutY="96.0" text="用户名:" /><Label layoutX="99.0" layoutY="146.0" text="密  码:" /><TextField fx:id="login_username" layoutX="174.0" layoutY="91.0" promptText="用户名" /><TextField fx:id="login_password" layoutX="174.0" layoutY="141.0" promptText="8位密码" /><Button fx:id="login_button" layoutX="140.0" layoutY="206.0" mnemonicParsing="false" onAction="#loginButtonClick" text="登  录" /></children>
</AnchorPane>

2. 创建登录页面对应的组件实现

package app.view.login;import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;import app.alterview.ViewAlter;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;public class LoginController extends LoginView implements Initializable {private static final Logger logger = Logger.getLogger(LoginController.class.getName());private ViewAlter viewAlter;@FXMLprivate Button login_button;@FXMLprivate TextField login_username;@FXMLprivate TextField login_password;public void loginButtonClick() {logger.log(Level.INFO, "输入用户名为:" + login_username.getText());logger.log(Level.INFO, "输入密    码为:" + login_password.getText());if("nikolazhang".equalsIgnoreCase(login_username.getText())&& "123654".equalsIgnoreCase(login_password.getText())) {logger.log(Level.INFO, "登录成功!");viewAlter.gotoMain();} else {logger.log(Level.WARNING, "用户名或密码错误!");            }}@Overridepublic void initialize(URL location, ResourceBundle resources) {}public void setApp(ViewAlter viewAlter) {this.viewAlter = viewAlter;}
}

3. 创建一个主页面

登录进去之后显示该界面

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.web.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?><AnchorPane fx:id="main" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.view.main.MainController"><children><BorderPane prefHeight="640.0" prefWidth="590.0"><top><Text strokeType="OUTSIDE" strokeWidth="0.0" text="欢迎进入系统" BorderPane.alignment="CENTER_LEFT" /></top><left><TreeView fx:id="main_treeview" onMouseClicked="#mainTreeViewClick" prefHeight="360.0" prefWidth="126.0" BorderPane.alignment="TOP_LEFT" /></left><center><ScrollPane prefHeight="600.0" BorderPane.alignment="CENTER"><content><AnchorPane fx:id="main_pane_under_scroll" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="593.0" prefWidth="480.0" /></content></ScrollPane></center><bottom><Text strokeType="OUTSIDE" strokeWidth="0.0" text="this system is created by NikolaZhang!" BorderPane.alignment="CENTER" /></bottom></BorderPane></children>
</AnchorPane>

4. 创建ViewAlter类用于跳转页面

package app.alterview;import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;import app.resource.StaticResourcesConfig;
import app.view.login.LoginController;
import app.view.main.MainController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;public class ViewAlter extends Application {private static final Logger logger = Logger.getLogger(ViewAlter.class.getName());private Stage stage;@Overridepublic void start(Stage primaryStage) throws Exception {stage = primaryStage;stage.setTitle("XXXX系统");gotoLogin();stage.show();}/*** 跳转到登录界面*/public void gotoLogin() {try {LoginController login = (LoginController) replaceSceneContent(StaticResourcesConfig.LOGIN_VIEW_PATH);login.setApp(this);} catch (Exception ex) {logger.log(Level.SEVERE, null, ex);}}/*** 跳转到主界面*/public void gotoMain() {try {MainController main = (MainController) replaceSceneContent(StaticResourcesConfig.MAIN_VIEW_PATH);main.setApp(this);} catch (Exception ex) {logger.log(Level.SEVERE, null, ex);}}/*** 替换场景* @param fxml* @return* @throws Exception*/private Initializable replaceSceneContent(String fxml) throws Exception {FXMLLoader loader = new FXMLLoader();InputStream in = ViewAlter.class.getResourceAsStream(fxml);loader.setBuilderFactory(new JavaFXBuilderFactory());loader.setLocation(ViewAlter.class.getResource(fxml));try {AnchorPane page = (AnchorPane) loader.load(in);Scene scene = new Scene(page, StaticResourcesConfig.STAGE_WIDTH, StaticResourcesConfig.STAGE_HEIGHT);stage.setScene(scene);stage.sizeToScene();} catch (Exception e) {logger.log(Level.SEVERE, "页面加载异常!");} finally {in.close();}return (Initializable) loader.getController();}public static void main(String[] args) {launch(args);}}

这个类是应用的启动类。页面跳转主要使用了自定义的replaceSceneContent方法,该方法的输入参数为界面的fxml的路径。
应用启动后,执行start方法初始加载登录界面。点击登录按钮,调用LoginController 的loginButtonClick方法,进行登录验证。验证通过调用gotoMain方法,页面跳转到主界面。

同一个布局中加载不同的界面

这里主要是实现了主界面中的TreeView。主界面的控制组件实现如下:

package app.view.main;import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;import app.alterview.ViewAlter;
import app.resource.StaticResourcesConfig;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.AnchorPane;public class MainController implements Initializable {private static final Logger logger = Logger.getLogger(MainController.class.getName());private ViewAlter viewAlter;@FXMLprivate TreeView<String> main_treeview;@FXMLprivate ScrollPane main_scroll_pane;@FXMLprivate AnchorPane main_pane_under_scroll;public void setApp(ViewAlter viewAlter) {this.viewAlter = viewAlter;}@Overridepublic void initialize(URL location, ResourceBundle resources) {setTreeView();}/*** 设置TreeView*/@SuppressWarnings("unchecked")public void setTreeView() {TreeItem<String> root = new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER);root.setExpanded(true);root.getChildren().addAll(new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER_ITEM1),new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER_ITEM2),new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER_ITEM3),new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER_ITEM4),new TreeItem<String>(StaticResourcesConfig.MAIN_TREE_HEADER_ITEM5));main_treeview.setRoot(root);}/*** TreeView 点击事件* @throws IOException */public void mainTreeViewClick() throws IOException {logger.log(Level.INFO, "点击TreeView");// 获取鼠标当前点击的ItemTreeItem<String> selectedItem = main_treeview.getSelectionModel().getSelectedItem();logger.log(Level.INFO, selectedItem.getValue());String pagePath = "";switch (selectedItem.getValue()) {case StaticResourcesConfig.MAIN_TREE_HEADER:pagePath = StaticResourcesConfig.DEFAULT_VIEW_PATH;break;case StaticResourcesConfig.MAIN_TREE_HEADER_ITEM1:pagePath = StaticResourcesConfig.NOTE_VIEW_PATH;break;case StaticResourcesConfig.MAIN_TREE_HEADER_ITEM2:pagePath = StaticResourcesConfig.CLIP_VIEW_PATH;break;case StaticResourcesConfig.MAIN_TREE_HEADER_ITEM3:pagePath = StaticResourcesConfig.USER_VIEW_PATH;break;case StaticResourcesConfig.MAIN_TREE_HEADER_ITEM4:pagePath = StaticResourcesConfig.DATA_VIEW_PATH;break;case StaticResourcesConfig.MAIN_TREE_HEADER_ITEM5:pagePath = StaticResourcesConfig.LANGUAGE_VIEW_PATH;break;}skipView(pagePath);}/*** 改变右侧scroll的界面* @param pagePath* @throws IOException*/private void skipView(String pagePath) throws IOException {logger.info("显示剪切板界面");ObservableList<Node> scrolChildren = main_pane_under_scroll.getChildren();scrolChildren.clear();scrolChildren.add(FXMLLoader.load(getClass().getResource(pagePath)));}}

main_treeview.getSelectionModel().getSelectedItem();获取鼠标点击的是哪个项目。根据点击加载不同的界面。加载界面时调用的方法为skipView,该方法首先清空之前布局中存在的元素,并通过FXMLLoader重新加载我们需要的页面。
效果如下:

补充

StaticResourcesConfig定义如下

package app.resource;public final class StaticResourcesConfig {public final static int STAGE_WIDTH = 800;public final static int STAGE_HEIGHT = 600;public final static String LOGIN_VIEW_PATH = "/app/view/login/LoginView.fxml";public final static String MAIN_VIEW_PATH = "/app/view/main/MainView.fxml";public final static String CLIP_VIEW_PATH = "/app/view/panel/clip/ClipView.fxml";public final static String NOTE_VIEW_PATH = "/app/view/panel/note/NoteView.fxml";public static final String DEFAULT_VIEW_PATH = "/app/view/panel/note/NoteView.fxml";public static final String LANGUAGE_VIEW_PATH = "/app/view/panel/note/NoteView.fxml";public static final String DATA_VIEW_PATH = "/app/view/panel/datanaly/DataView.fxml";public static final String USER_VIEW_PATH = "/app/view/panel/usermanage/UserView.fxml";// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW// WWW   界面字段显示                   WWW// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWpublic final static String MAIN_TREE_HEADER = "首页";public final static String MAIN_TREE_HEADER_ITEM1 = "记事本";public final static String MAIN_TREE_HEADER_ITEM2 = "剪贴板";public final static String MAIN_TREE_HEADER_ITEM3 = "用户管理";public final static String MAIN_TREE_HEADER_ITEM4 = "数据分析";public final static String MAIN_TREE_HEADER_ITEM5 = "语言";}

JAVAFX界面跳转和加载不同的界面相关推荐

  1. pyqt登录界面跳转及传值给主界面

    pyqt登录界面跳转及传值给主界面 开头 最近要做一个应用,其中一个模块要管理表格数据,设置登录界面.目的是实现登录界面验证身份,而后登录主窗口,将登录用户名传递给主窗口.本来也可以通过登录窗口对数据 ...

  2. KTV项目之3个ListView的跳转和加载歌手图片

    第一个ListView: 第二个ListView: 第三个ListView: 定义一个KTVUtil类,在里面定义一个静态变量保存歌手图片 1 //定义一个静态变量保存歌手图片路径 2 public ...

  3. 微信-H5界面跳转至公众号关注界面问题

    第三方的公众号h5界面想要提供一个按钮直接跳转至我们的公众号关注界面,让用户可以在他们的公众号中直接关注我们的公众号,用户不需要在微信搜索我们的公众号进行关注. 一.尝试网上说的方案 结论不可行,有兴 ...

  4. 一个PHP多个界面跳转,php中的多种界面跳转方式

    经过10000次测试写的工具类的随机字符串重复率为0.0 下面是生成指定长度的随机字符串和测试随机字符串函数的重复率以及测试代码: import java.util.Random; public cl ...

  5. Matlab GUI编程技巧(六):从一个GUI界面跳转到另一个GUI界面以及GUI窗口间数据传递

  6. Android Activity界面跳转动画讲解

    在日常开发中,我们可能会给每个活动界面切换时添加一个动画,那这种效果是如何实现的呢. 先看下效果图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0tZH0om-15 ...

  7. JavaFX界面跳转

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

  8. 详解ETL银行数据仓储抽取和加载流程概述

    ETL和ELT ETL是Extract.Transfrom.Load即抽取.转换.加载三个英文单词首字母的集合: E:抽取,从源系统(Souce)获取数据: T:转换,将源系统获取的数据进行处理加工, ...

  9. # 利用fragment实现界面跳转

    利用fragment实现界面跳转 任务要求 利用fragment实现界面跳转功能,完成效果如下图所示 图片1 我的想法是在xml文件里设置Button.再创建一个fragment文件.在java文件中 ...

最新文章

  1. 关于Javascript的内存泄漏问题的整理稿
  2. 《大规模Scrum:More with LeSS》访谈
  3. php循环获取xml节点,PHP_PHP遍历XML文档所有节点的方法,本文实例讲述了PHP遍历XML文档 - phpStudy...
  4. 一起来开发Android的天气软件(三)——使用Volley实现网络通信
  5. 【Unity3D自学记录】判断物体是否在镜头内
  6. VTK修炼之道31:图像二值化_阈值法
  7. c++STL容器的stack
  8. 爱立信车联网招聘DevOps工程师(地点:广州)
  9. 「斑愿称为最肝」小狮子前端知识食谱 / 生日之际,好运分享 / 秋招和你手摸手入大厂【史上最全指北】 | CSDN技术征文
  10. [UE4]IES光源概述文件
  11. Dart语言入门(一)
  12. 教您启用iphone 4 使用FaceTime和蜂窝数据网、彩信!设置(不需補丁、不需恢复系统)
  13. Snort:Barnyard2+MySQL+BASE 基于Ubuntu 14.04SNORT
  14. 米斯特web安全培训第一期课程目录
  15. 适用于计量站电子测量仪器自动检定系统设计
  16. mysql 中创建自增的序列(Sequence)
  17. 【Windows】使用U盘为Windows 11创建密码重置盘
  18. 安卓逆向——某宝APP抓包之环境对比 (一)
  19. python将dataframe导出为csv_Pandas DataFrame如何转换为CSV?详细操作————
  20. Mac OS 使用远程桌面登录服务器

热门文章

  1. 【转载】吉安,被遗忘的才子之乡
  2. Python爬取天天基金网历史数据
  3. 企业管理员必看:企业邮箱如何注册?企业邮箱账号怎么管理?
  4. 压力测试 闪存_[实验]苹果今年大范围使用的TLC闪存颗粒真的是那么不堪吗?
  5. 计算机屏幕闪烁黑屏,台式机电脑。显示屏指示灯一直闪烁,屏幕黑屏。。...-显示器电源灯闪黑屏...
  6. 如何用Python爬虫爬取网页免费小说
  7. Nginx反向代理,返回405错误的解决办法
  8. 神级:程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结
  9. 迁移学习---迁移学习基础概念、分类
  10. JAVA:实现LongestPalindromicSubsequence最长回文子序列算法(附完整源码)