1-------理解:

每个FXML只可以有一个Controller控制器,用于加载各种基于逻辑处理的服务,类似js为html处理服务一样的性质,FXML窗体调用的各种方法和事件都是来自其指向的controller,他是唯一的,一般使用fxml的根节点进行指定,而fxml里面的其他子节点则对应指定其controller中的方法!

2--------引入:

创建Controller方法并实现import javafx.fxml.Initializable 接口。然后在fxml中使用如下方式 指定:

类    :fx:controller="com.UserController"  

属性: fx:id="btn0"                             -----------------------------可以获取该动作的id属性,在controller中形成controller的属性

动作:onAction="#btn0Action"           ----------------------------当按钮被启动的时候可以调用该对应的方法

以上引入方式在使用的时候需要在controller中其对应的属性和方法上,实现@FXML 以表示为FXML的引入,controller控制器则需要实现 Initializable 。 如果在属性和方法名的前面加上@FXML则方法可以是private,如果不写则表示是public属性的。

==========================================================================================

设置完成controller的根节点后,选中视图树(分层结构)中的任意节点,在右边面板选择“代码”属性面板,有很多事件可供设置,其值为控制器中的方法名前面加上一个#加上方法名字。保存即可!

------关于controller在使用图形化界面的时候,也需要手动在FXML中设置如下

类    :fx:controller="com.UserController"  

------在fxml的secence builder的图形界面工具中,当保存完成后,打开view视图,选择show sample controller skeleton ,里面则为对应的controller代码,选择复制即可!

------获取controller的实例对象

FXMLLoader  fxmlLoader=new  FXMLLoadere(getClass().getResouce("sample.fxml").toString());
Parent  root=fxmlLoader.load();
//如果使用 Parent root = FXMLLoader.load(...) 静态读取方法,无法获取到Controller的实例对象
Scene  scene=new  Scene(root,300,200);
Controller  controller=fxmlloader.getController();//获取Controller的实例对象

controller.createMediaPlayer(url); //调用controller的方法

3--------逻辑流程:

Main方法通过lanuch()启动程序,加载fxml,再由 fxml 加载指定的 controller,这个过程是单向的,所以其实 fxml 中并没法绑定 Main 中的 stage和scene,必须由 Main 加载一个 stage 后,由再加载fxml 文件对其进行初始化的设置,所以 fxml 文件不会指定 Stage,Scene,一般由 Main 来指定 Stage 及其对应的 Scene,或者将Main中的Stage对象传递给Controller 来进行设置