Javafx利用fxml变换场景的小细节

1.fxml中的线程问题

java 复制代码
    public void start(Stage stage) throws Exception {
        primaryStage = stage;
        Scene loginScene;
        FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml"));
        loginScene = new Scene(loginFxml.load());
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.getIcons().add(new Image("resource/img/icon.png"));

        primaryStage.setScene(loginScene);      //这里会执行initialize方法,
//加载布局类并且加载点击事件
        //在这里进行方法的执行,(这里对controller私有的stage进行赋值,
//然后对他进行事件操作,之间绑定事件,但是不执行)
        ((loginController)loginFxml.getController()).setStage(primaryStage);
        primaryStage.show();

    }

在这个代码中,在JavaFX中,FXMLLoader是用来加载FXML文件并将其转换为Java对象(例如控制器类)的工具。在这时,就已经创建了一个实例对象对应的Controller。

当您使用FXMLLoader加载FXML文件时,它会异步地执行以下步骤:

  1. 加载FXML文件:FXMLLoader会从指定的URL加载FXML文件。
  2. 解析FXML:它会解析FXML文件,并将其转换为Java对象,包括创建控制器类的新实例。
  3. 绑定和布局:它会将FXML文件中的布局和控件与Java对象绑定,并设置它们的布局和样式。
  4. 事件处理:它会设置控件的事件处理方法,如按钮的点击事件等。

注意:这时候你如果要想自己进行初始化一些字体,类型,等等... 可以写在Controller类中的initialize方法中(这个名字不能变),因为在加载这个文件时会指向这个方法

(如果在进行场景更换的时候,在这个方法中不能写对这个scene的操作,因为这个scene还是原来stage调用的scene,后面又进行场景,相当于没有操作)

在整个过程中,FXMLLoader是使用JavaFX的后台线程(也称为JavaFX线程)来执行这些操作的,这是为了保持UI线程的响应性。这意味着在用户界面(UI)线程中,您不会看到任何阻塞,即使FXMLLoader正在执行耗时的操作。

FXMLLoader完成加载并调用load()方法时,它会返回一个Parent对象,这是FXML文件中定义的根节点的JavaFX表示。您可以将这个Parent对象添加到场景中,然后设置场景到舞台上。

primaryStage.setScene(loginScene);被执行时,FXMLLoaderload()方法已经完成,并且loginScene已经被创建。此时,loginScene中的布局类(控制器类)已经被加载,并且与FXML文件中的控件绑定的事件处理方法也已经设置好了

后面添加代码时,就可以安全地执行与控制器类相关的操作,因为控制器类已经加载并准备好使用。例如,您可以调用控制器类的方法,设置舞台属性等。

FXMLLoaderload()方法是在后台线程中执行的,以确保UI线程的响应性。当load()方法完成后,您可以在主线程中安全地使用控制器类和FXML文件中的控件。

这其中最大的坑就是要意识到initialize这个方法是要进行初始化的,不要在这个方法中直接对controller的成员直接进行操作(除非是赋值操作,然后再进行更改操作)

2.不同Controller之间交互的方式

1.可以在每个controller中私有一个stage,然后再在Controller类中创建一个setstage方法,可以像上面一样执行,对这个stage进行赋值,然后就可以操作这个场景。

java 复制代码
    FXMLLoader loginFxml = new FXMLLoader(mainContrller.class.getResource("/resource/fxml/loginmenu.fxml"));
        loginScene = new Scene(loginFxml.load());
//这里执行controller类中的方法
//这个((loginController)loginFxml.getController())已经是个实例对象了
((loginController)loginFxml.getController()).setStage(primaryStage);

2.可以在主控制类中公开这个stage,并设置这个静态的,其它的controller直接在initialize里面进行赋值操作。

3.两个选项小功能

密码的可视化(这操作感觉很复杂,也不知道有没有简单方法)

首先是一个toggleButton设置一个按钮,能够判断是否点击可视化,然后在密码文本那里要设置两个文本,一个password,一个普通文本,普通文本要绑定password文本,并且要设置普通文本不可操作disable ="true";

java 复制代码
ToggleButton eyeButton;
eyeButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                if (newValue )
                {
                    System.out.println("isSelected");
                    eyeButton.setText(eyeUnicode);
                    passwordFiled.setVisible(true);
                    passwordFiledOut.setVisible(false);
                }
                else
                {
                    eyeButton.setText(uneyeUnicode);
                    passwordFiled.setVisible(false);
                    passwordFiledOut.setVisible(true);
                }
            }
        });

这里监听toggleButton是否点击,可以判断是否想要能够可视选项

相关推荐
java亮小白19972 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF8 分钟前
java Queue 详解
java·队列
武子康30 分钟前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康32 分钟前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言38 分钟前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
界面开发小八哥1 小时前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
草莓base1 小时前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
Allen Bright1 小时前
maven概述
java·maven
编程重生之路1 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea