# datafx8-tutorials **Repository Path**: nul-space/datafx8-tutorials ## Basic Information - **Project Name**: datafx8-tutorials - **Description**: 基于DataFX8.0官方教程的练习. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-07 - **Last Updated**: 2023-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1. 大纲 **001_[2023-09-06]**: 项目说明 **002_[2023-09-06]**: 项目内容说明 **003_[2023-09-06]**: 各模块依赖说明 **004_[2023-09-06]**: 各模块实现效果说明 **005_[2023-09-06]**: 不同模块启动类比较 # 2. 内容 ## **001_[2023-09-06]** > 项目说明 本项目是参考DataFX官方教程 **[1]** 做的个人练习,DataFX是JavaFX的一个开源组件,作用是连接控制器和FXML文件,可以实现界面的动态切换. DataFX的源码和教程样例可参考 **[2]**. ## **002_[2023-09-06]** > 项目内容说明 项目内共有flow1 ~ flow6这6个模块,对应官方教程 **[1]** 中的6个教程. 每个模块都是独立的,分别运行各自启动类AppStartup1 ~ 6即可启动. ## **003_[2023-09-06]** > 各模块依赖说明 flow1~flow5的依赖如下: ```xml io.datafx flow 8.0 ``` flow6依赖于libs中的jar包 (datafx-core-8.0.2-SNAPSHOT.jar、datafx-flow-8.0.2-SNAPSHOT.jar),以及下面通过pom.xml引入的依赖 (否则会报*Caused by: java.lang.ClassNotFoundException: javax.inject.Inject*的错误): ```xml com.google.inject guice 4.0 ``` ## **004_[2023-09-06]** > 各模块实现效果说明 - **flow1** 单击按钮实现数字增长. - **flow2** 单击按钮实现页面切换 . - **flow3** 前进、后退切换页面,在各视图中触发的. - **flow4** flow4 和flow3的看起来效果是一样的,区别有两点: (1)视图切换是在菜单条中触发的,工具栏+上面的空白StackPane其实是一个整体的主视图,各视图的fxml中只有要展示出来的Label而已,实际上是不同的Label在带有菜单条的主视图中切换而已. (2)在于Step1的页面右上角有个?的超链接,单击后控制台会打印信息: - **flow5** 前进、后退切换视图,在flow4的基础上实现的,但是增加了放大特效. - **flow6** 通过单选按钮选择要跳转的目标视图,点击确认跳转按钮进行跳转. ## 005_[2023-09-06] > 不同模块启动类比较 - flow1~flow3、flow6的类型(最原始的方法) flow3中,各视图控制类中均定义了导航和操作,因此启动类用最基础的即可 ```java package io.datafx.tutorial; import io.datafx.controller.flow.Flow; import io.datafx.tutorial.controller.SimpleController; import javafx.application.Application; import javafx.stage.Stage; public class AppStartup1 extends Application { @Override public void start(Stage primaryStage) throws Exception { /*------ flow1 ------*/ new Flow(SimpleController.class).startInStage(primaryStage); /*------ flow2 ------*/ // new Flow(View1Controller.class).startInStage(primaryStage); /*------ flow3 ------*/ // new Flow(WizardStartController.class).startInStage(primaryStage); /*------ flow4 ------*/ // new Flow(MainController.class).startInStage(primaryStage); } public static void main(String[] args) { launch(args); } } ``` - flow4的类型(启动类中定义导航和操作). 注:与flow3不同,flow4的导航和定义不在各视图控制类中,而是通过界面下方的工具栏触发的,该模式需在启动类中定义视图切换逻辑. ```java package io.datafx.tutorial; import io.datafx.controller.flow.Flow; import io.datafx.tutorial.controller.*; import javafx.application.Application; import javafx.stage.Stage; public class AppStartup4 extends Application { @Override public void start(Stage primaryStage) throws Exception { new Flow(WizardStartController.class). withLink(WizardStartController.class, "next", Wizard1Controller.class). withLink(Wizard1Controller.class, "next", Wizard2Controller.class). withLink(Wizard2Controller.class, "next", Wizard3Controller.class). withLink(Wizard3Controller.class, "next", WizardDoneController.class). withGlobalBackAction("back"). withGlobalLink("finish", WizardDoneController.class). withGlobalTaskAction("help", () -> System.out.println("## There is no help for the application :( ##")). startInStage(primaryStage); } public static void main(String[] args) { launch(args); } } ``` - flow5的类型(定义一个主视图,各视图中只定义相对于主视图动态变化的信息. 由于主视图控制类中定义了视图切换的逻辑,因此启动类中需增加主视图控制类的定义) ```java package io.datafx.tutorial; import io.datafx.controller.flow.Flow; import io.datafx.controller.flow.FlowHandler; import io.datafx.controller.flow.container.DefaultFlowContainer; import io.datafx.tutorial.controller.WizardController; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class AppStartup5 extends Application { @Override public void start(Stage primaryStage) throws Exception { Flow flow = new Flow(WizardController.class); FlowHandler flowHandler = flow.createHandler(); StackPane pane = flowHandler.start(new DefaultFlowContainer()); primaryStage.setScene(new Scene(pane)); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 综上所述,对比如下: | flow1~flow3 | flow4 | flow5 | flow6 | | ------------------------------------------------ | ---------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 各视图中需定义视图切换逻辑,启动类用最原始的即可 | 各视图无需定义视图切换逻辑,但需在启动类中定义 | 定义一个主视图,视图切换逻辑都定义在主视图控制类中,所以启动类中无需定义切换逻辑,只需定义主视图相关信息即可 | 定义一个主视图,其控制类中定义了视图切换逻辑,启动类中也无需定义主视图控制类信息,启动类用最原始的即可 | # 3. 参考 [1] [DataFX 8.0 Tutorials](https://guigarage.com/2014/05/datafx-8-0-tutorials/) [2] [DataFX/tutorials at master · guigarage/DataFX · GitHub](https://github.com/guigarage/DataFX/tree/master/tutorials)