前面介绍了如何通过fxml文件编排界面布局,可是光有静态界面根本没法处理业务,必须另外书写业务逻辑的代码,方能响应各按钮的单击事件,并将业务结果即使呈现到界面上。显然,fxml内部写不了Java代码,同时入口程序已经把控件都托管给了fxml文件,也无法在Application代码中干预控件的操作。既然整个界面都托付给了fxml,那么解铃还须系铃人,只能且必须由fxml指定后续的逻辑控制器。具体做法是在fxml的根节点中添加属性“fx:controller”,通过该属性设置当前界面的控制器路径。比如之前的登录布局文件login_with_flow.fxml,它的根节点是流式窗格FlowPane,所以就给FlowPane节点补充“fx:controller”的取值,详细的标签例子见下:

<FlowPane fx:controller="com.javafx.fxml.LoginController"xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="5" vgap="5">

由以上的FlowPane标签可知,它指定的控制器路径为“com.javafx.fxml.LoginController”,这个LoginController类正是login_with_flow.fxml对应的控制器代码。作为FXML专属的搭档,控制器也要符合一定的格式规范,首先它必须实现了接口Initializable,并重写该接口定义的initialize方法,这个方法顾名思义会在界面初始化之时调用。其次,控制器内部需要声明FXML文件定义好的控件编号,这样才能通过控件编号操作每个控件对象。下面便是一个控制器范本的代码示例:

//界面控制器必须实现自接口Initializable
public class LoginController implements Initializable {@FXMLprivate 控件类型 控件编号; // 其中控件类型为JavaFX的控件类名,控件编号取自fxml文件中的fx:id@Overridepublic void initialize(URL location, ResourceBundle resources) { // 界面打开后的初始化操作// 可在此给各控件设置单击事件或者选中事件,也可设置控件上的文本字体及其大小}
}

仍以前述的登录窗口为例,它的布局文件名叫login_with_flow.fxml,同时fxml文件设定了界面对应的控制器叫做LoginController。注意到登录窗口拥有两个单选按钮和一个登录按钮,这三个按钮都应当触发单击或者选中事件,于是在控制器的代码中分别声明几个待操作的控件对象,对象名称与fxml中的fx:id保持一致。然后重写控制器的initialize方法,在该方法中各自调用三个按钮的setOnAction方法,用以注册单击或选中按钮后的触发事件。根据以上说明编写登录窗口的控制器代码示例如下:

//登录窗口的界面控制器
public class LoginController implements Initializable {@FXMLprivate RadioButton rbPassword; // 密码登录对应的单选按钮@FXMLprivate RadioButton rbVerifycode; // 验证码登录对应的单选按钮@FXMLprivate Label labelUser; // 用户名标签@FXMLprivate TextField fieldUser; // 用户名输入框@FXMLprivate Label labelPassword; // 密码标签@FXMLprivate PasswordField fieldPassword; // 密码输入框@FXMLprivate Button btnLogin; // 登录按钮@FXMLprivate Label labelLoginResult; // 登录结果标签@Overridepublic void initialize(URL location, ResourceBundle resources) { // 界面打开后的初始化操作rbPassword.setOnAction(e -> { // 选中“密码登录”单选按钮后触发的事件labelUser.setText("用户名:");labelPassword.setText("密 码:");});rbVerifycode.setOnAction(e -> { // 选中“验证码登录”单选按钮后触发的事件labelUser.setText("手机号:");labelPassword.setText("验证码:");});// btnLogin.setOnAction(e -> { // 单击“登录”按钮后触发的事件String result = String.format("您输入的用户名为%s,密码为%s", fieldUser.getText(), fieldPassword.getText());labelLoginResult.setText(result); // 在登录结果标签上显示登录信息});}
}

由上面代码可见,这个控制器的处理逻辑很简单,选中按钮后仅仅给文本标签设置指定文字而已,当然这样也方便观察控件的操作结果。

回到登录窗口的入口代码LoginMain,运行测试程序弹出如下图所示的登录界面。


由图示可见登录窗口默认选中“密码登录”,接着单击右边的“验证码登录”按钮,发现下方的用户名标签变成了“手机号:”,密码标签变成了“验证码:”,说明“验证码登录”按钮的选中事件被正常触发。然后分别在用户名输入框与密码输入框中填入用户名和密码,再单击下面的登录按钮,此时登录窗口的界面效果如下图所示。


果不其然,登录按钮下方的文本标签展示了输入的用户名和密码信息,可知登录按钮的单击事件也正确响应了。


更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/11438300.html

Java开发笔记(一百四十四)实现FXML对应的控制器相关推荐

  1. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  2. Android开发笔记(五十四)数据共享接口ContentProvider

    ContentProvider 前面几节介绍了进程间通信的几种方式,包括消息包级别的Messenger.接口调用级别的AIDL.启动页面/服务级别的Notification,还有就是本节这个数据库级别 ...

  3. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

  4. Android开发笔记(七十四)布局文件优化

    include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...

  5. Android开发笔记(二十四)res目录的结构与配置

    res目录结构 res是Android项目工程中存放各类的目录,主要包括布局.图形与配置等等.res的子目录主要有: anim : 存放动画的描述文件 drawable : 存放各类图形的描述文件,包 ...

  6. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  7. Java开发笔记(八十八)文件字节I/O流

    前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...

  8. matlab火星漫游车转向控制,OSG开发笔记(二十四):OSG漫游之平移与转向

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/ ...

  9. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/123696821 各位读者,知识无穷而人力有穷 ...

  10. Android开发笔记(八十四)使用Properties读写属性值

    Properties概述 Java中的配置文件常为.properties文件,而Properties类便是读写此类文件的工具.属性文件有两种格式,一种是文本格式,其内容是"键=值" ...

最新文章

  1. 基于redhat linux虚拟服务器的web负载均衡集群(piranha+LVS)
  2. GridView列值绑定
  3. 抓包工具- fiddler的安装
  4. 动态壁纸小程序(带流量主)源码
  5. [Spring实战系列](6)配置Spring IOC容器的Bean
  6. Android 系统(252)---Android:BLE智能硬件开发详解
  7. 程序员,Linux 下如何避免从删库到跑路的悲剧?
  8. 自动化测试UI Test, Performance Test, Load Test 总结整理
  9. Android学习笔记25-画廊控件Gallery的使用
  10. Redis 的key设计技巧缓存问题
  11. MATLAB用solve求解普通二元高次方程
  12. 下次面试再一上来就问我线程有哪些状态,我上去就是给他一 jio
  13. “对症下药”的11种新的编程语言
  14. 在线支付系列【2】支付宝和微信支付发展史
  15. Git与GitHub基础全套完整版教程(持续更新....)
  16. 寒假第三周网页制作总结
  17. Pycharm添加默认头注释方法
  18. 奥运五环-web前端
  19. c语言生日快乐爱心,C语言 生日快乐
  20. java orm设计_大搜车orm框架设计思路

热门文章

  1. 数据结构和算法——线性结构(3)递归和斐波那契数列、汉诺塔问题
  2. 2021-03-08
  3. java图片工具类_Java 下载图片下载文件 工具类
  4. 微服务网关(gateway)概述 与 嵌入式 Zuul 反向代理
  5. 阶段3 3.SpringMVC·_07.SSM整合案例_07.ssm整合之编写MyBatis框架测试保存的方法
  6. mysql 自增序列(转)
  7. 阶段3 2.Spring_02.程序间耦合_2 编译期依赖
  8. java文件编译后,出现xx$1.class的原因
  9. 跨域请求的两种实现方式
  10. element的form表单中如何一行显示多el-form-item标签