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

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

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

csharp;gutter:true; //界面控制器必须实现自接口Initializable public class LoginController implements Initializable { @FXML private 控件类型 控件编号; // 其中控件类型为JavaFX的控件类名,控件编号取自fxml文件中的fx:id</p> <pre><code>@Override public void initialize(URL location, ResourceBundle resources) { // 界面打开后的初始化操作 // 可在此给各控件设置单击事件或者选中事件,也可设置控件上的文本字体及其大小 } </code></pre> <p>}</p> <pre><code> 仍以前述的登录窗口为例,它的布局文件名叫login_with_flow.fxml,同时fxml文件设定了界面对应的控制器叫做LoginController。注意到登录窗口拥有两个单选按钮和一个登录按钮,这三个按钮都应当触发单击或者选中事件,于是在控制器的代码中分别声明几个待操作的控件对象,对象名称与fxml中的fx:id保持一致。然后重写控制器的initialize方法,在该方法中各自调用三个按钮的setOnAction方法,用以注册单击或选中按钮后的触发事件。根据以上说明编写登录窗口的控制器代码示例如下: ;gutter:true;
//登录窗口的界面控制器
public class LoginController implements Initializable {
@FXML
private RadioButton rbPassword; // 密码登录对应的单选按钮
@FXML
private RadioButton rbVerifycode; // 验证码登录对应的单选按钮
@FXML
private Label labelUser; // 用户名标签
@FXML
private TextField fieldUser; // 用户名输入框
@FXML
private Label labelPassword; // 密码标签
@FXML
private PasswordField fieldPassword; // 密码输入框
@FXML
private Button btnLogin; // 登录按钮
@FXML
private Label labelLoginResult; // 登录结果标签

@Override
public 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开发笔记(一百四十四)实现FXML对应的控制器
由图示可见登录窗口默认选中”密码登录”,接着单击右边的”验证码登录”按钮,发现下方的用户名标签变成了”手机号:”,密码标签变成了”验证码:”,说明”验证码登录”按钮的选中事件被正常触发。然后分别在用户名输入框与密码输入框中填入用户名和密码,再单击下面的登录按钮,此时登录窗口的界面效果如下图所示。

Java开发笔记(一百四十四)实现FXML对应的控制器
果不其然,登录按钮下方的文本标签展示了输入的用户名和密码信息,可知登录按钮的单击事件也正确响应了。

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

Original: https://www.cnblogs.com/pinlantu/p/11438300.html
Author: pinlantu
Title: Java开发笔记(一百四十四)实现FXML对应的控制器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574389/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 面试遇到的常用问题

    一、线程池的问题 1、newSingleThreadExecutor 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因…

    Java 2023年6月6日
    0117
  • ArrayList扩容代码分析

    ArrayList扩容机制是在面试中频繁出现的问题,平时了解的比较含糊,特此记录! 注意:每次发生扩容,其容量扩充为原来的1.5倍 左右 add方法 public boolean …

    Java 2023年6月15日
    0121
  • Collectors.reducing总结

    Collectors.reducing总结 1. 方法签名 一个参数 public static Collector> reducing(BinaryOperator op)…

    Java 2023年6月13日
    0138
  • 为Eclipse创建Ant的build.xml文件编辑自动提示

    JavaEE版的Eclipse自动集成了Ant插件,但是,并没有提供Ant的DTD文件。原因在Apache官网的Ant项目下的FAQ中有解释,原文如下: **Is there a …

    Java 2023年6月8日
    070
  • GateWay

    即满足某种规则之后即向指定路径路由,否则应为404。 #参数合并写法 spring: cloud: gateway: routes: – id: after_route #路由规则…

    Java 2023年6月16日
    0181
  • java-面向对象三大特征

    面向对象编程的三大特征:继承、封装、多态 继承是面向对象编程的三大特征之一。继承让我们更加容易实现类的扩展。实现代码的重用,不用再重新发明轮子(don’t reinve…

    Java 2023年6月15日
    0126
  • 【SpringCloud原理】Ribbon核心组件以及运行原理万字源码剖析

    系列文章还在持续更新,如有喜欢的小伙伴可以关注微信公众号 三友的java日记 一、Ribbon的核心组件 1、Server 这是个很简单的东西,就是服务实例数据的封装,里面封装了服…

    Java 2023年6月16日
    0101
  • 油猴插件安装以及好用的脚本推荐

    现在浏览器不搞几个插件和IE浏览器有啥区别,因此今天推荐一下及其强力的油猴(Tampermonkey)插件。 一、Tampermonkey插件安装 想使用插件首先要安装插件,我这里…

    Java 2023年6月13日
    0123
  • Spring5 源码解析 IOC默认标签解析上半部分之解析BeanDefinition

    前言 前两篇文章,Spring5源码解析_整体架构分析、IOC容器的基本实现大家应该对Spring的IOC容器有了初步的了解,接下来我们研究Spring标签的解析,Spring标签…

    Java 2023年6月7日
    099
  • 矩阵中的最短路问题

    题目大意:给定一个m * n的矩阵,每个点都有对应意义的权值,求从起点到终点的最短距离(权值路径)。 以2290题为例,给定m * n的矩阵grid,每个单元格可能有两个值:0表示…

    Java 2023年6月13日
    0110
  • spring上传文件

    本文将说明spring上传文件如何配置,以及从request请求中解析到文件流的原理 #添加依赖 主要用来解析request请求流,获取文件字段名、上传文件名、content-ty…

    Java 2023年6月9日
    0144
  • 工程师什么时机最合适选择跳槽?

    先聊一下跳槽这个事。在 Java 工程师的职业生涯中,跳槽几乎是我们每一位工程师都会经历的事情。但在面试前需要考虑清楚:现在到底应不应该跳槽? class Resume { pub…

    Java 2023年6月13日
    0102
  • Java应用工程结构

    分层的本质是关注点分离,隔离对下层的变化,可以简化复杂性,使得层次结构更加清晰。 1. 主流分层结构介绍 目前业界存在两种主流的应用工程结构:一种是阿里推出的《Java开发手册》中…

    Java 2023年5月29日
    0130
  • SSM整合过程中遇到的BUG 数据库连接的问题

    SSM整合过程中遇到的BUG 数据库连接的问题service调用mybatis时报异常 org.springframework.web.util.NestedServletExce…

    Java 2023年6月5日
    0137
  • 【笔试】2、勾股数元祖或者素勾股数

    package y2020.interview.huawei.gougushu; import java.util.ArrayList; import java.util.List…

    Java 2023年6月5日
    0160
  • Java广度优先爬虫示例(抓取复旦新闻信息)

    以下内容仅供学习交流使用,请勿做他用,否则后果自负。 一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar…

    Java 2023年5月29日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球