# 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)