001_[2023-09-06]: 项目说明
002_[2023-09-06]: 项目内容说明
003_[2023-09-06]: 各模块依赖说明
004_[2023-09-06]: 各模块实现效果说明
005_[2023-09-06]: 不同模块启动类比较
项目说明
本项目是参考DataFX官方教程 [1] 做的个人练习,DataFX是JavaFX的一个开源组件,作用是连接控制器和FXML文件,可以实现界面的动态切换. DataFX的源码和教程样例可参考 [2].
项目内容说明
项目内共有flow1 ~ flow6这6个模块,对应官方教程 [1] 中的6个教程. 每个模块都是独立的,分别运行各自启动类AppStartup1 ~ 6即可启动.
各模块依赖说明
flow1~flow5的依赖如下:
<dependency>
<groupId>io.datafx</groupId>
<artifactId>flow</artifactId>
<version>8.0</version>
</dependency>
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的错误):
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.0</version>
</dependency>
各模块实现效果说明
flow1
单击按钮实现数字增长.
flow2
单击按钮实现页面切换 .
flow3
前进、后退切换页面,在各视图中触发的.
flow4
flow4 和flow3的看起来效果是一样的,区别有两点:
(1)视图切换是在菜单条中触发的,工具栏+上面的空白StackPane其实是一个整体的主视图,各视图的fxml中只有要展示出来的Label而已,实际上是不同的Label在带有菜单条的主视图中切换而已.
(2)在于Step1的页面右上角有个?的超链接,单击后控制台会打印信息:
flow5
前进、后退切换视图,在flow4的基础上实现的,但是增加了放大特效.
flow6
通过单选按钮选择要跳转的目标视图,点击确认跳转按钮进行跳转.
不同模块启动类比较
flow3中,各视图控制类中均定义了导航和操作,因此启动类用最基础的即可
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);
}
}
注:与flow3不同,flow4的导航和定义不在各视图控制类中,而是通过界面下方的工具栏触发的,该模式需在启动类中定义视图切换逻辑.
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);
}
}
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 |
---|---|---|---|
各视图中需定义视图切换逻辑,启动类用最原始的即可 | 各视图无需定义视图切换逻辑,但需在启动类中定义 | 定义一个主视图,视图切换逻辑都定义在主视图控制类中,所以启动类中无需定义切换逻辑,只需定义主视图相关信息即可 | 定义一个主视图,其控制类中定义了视图切换逻辑,启动类中也无需定义主视图控制类信息,启动类用最原始的即可 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。