javaFx新建弹窗页面并传值

      由于之前图省事在弹窗Controller类中用static定义变量接受原始页面传值导致被sonar校验,特地研究了一下javaFx向弹窗传值的方式。

      方式有两种

     1、直接传一个controler实例过来,后面弹窗页面如果有用到的话直接可以从controller中获取。

     2、传需要的属性到工具类的setControllerFactory中,直接赋值给新建的窗口controller。

     我的创建窗口工具类如下,关键在于lorder.setControllerFactory()

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.util.Callback;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Objects;

/**
 * javaFx新建窗口类
 *
 * @Date: 2021-08-16
 */
public class CreateWindowUtil {
    /**
     * 第一种方式,直接将controller对象传过来,
     *
     * @param controller   弹窗页面对应的controller
     * @param primaryStage 新建的stage
     * @param fxmlName     关联的fxml
     * @param titleName    新建页面的标题
     */
    public void start1(Object controller, Stage primaryStage, String fxmlName,
                       String titleName) {
        try {
            FXMLLoader loader =
                    new FXMLLoader(Objects.requireNonNull(getClass().getResource(fxmlName)));
            // 直接将单例放到工厂类中
            loader.setControllerFactory(param -> controller);
            Parent parent = loader.load();
            Scene scene = new Scene(parent);
            primaryStage.setScene(scene);
            primaryStage.setTitle(titleName);
            primaryStage.setResizable(false);
            primaryStage.setOnCloseRequest(null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        primaryStage.show();
    }

    /**
     * 第二种方式,单独传需要的对象或者属性过来
     * 不推荐,这种方法不能作为工具类使用
     *
     * @param myName       需要的对象或属性
     * @param primaryStage 新建的stage
     * @param fxmlName     关联的fxml
     * @param titleName    新建页面的标题
     */
    public void start2(String myName, Stage primaryStage, String fxmlName,
                       String titleName) {
        try {
            FXMLLoader loader =
                    new FXMLLoader(Objects.requireNonNull(getClass().getResource(fxmlName)));
            // 直接将单例放到工厂类中
            loader.setControllerFactory(param -> {
                WindowController controller = null;
                try {
                    controller = new WindowController();
                    // 这里赋值
                    controller.setName(myName);
                    // 这里设置需要的属性
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return controller;
            });
            Parent parent = loader.load();
            Scene scene = new Scene(parent);
            primaryStage.setScene(scene);
            primaryStage.setTitle(titleName);
            primaryStage.setResizable(false);
            primaryStage.setOnCloseRequest(null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        primaryStage.show();
    }
}

调用方式:makeSure()是我按钮的点击事件

    @FXML
    private void makeSure() {
        String myName = name.getText() == null ? "" : name.getText();
        controller.setName(myName);
        // 赋值方法1
        new CreateWindowUtil().start1(controller, new Stage(), "WindowPage" +
                ".fxml", "弹窗1");
        // 赋值方法2
        new CreateWindowUtil().start2(myName, new Stage(), "WindowPage" +
                ".fxml", "弹窗2");
    }

实现效果:

javaFx向弹窗传值

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFXJava平台上用于创建富客户端应用程序的图形界面工具包。它提供了丰富的UI控件和灵活的布局容器,可用于构建各种界面效果。 在JavaFX中,可以使用FXML(FXML是JavaFX中的一种XML文件格式)来定义界面布局。下面是一个简单的JavaFX数据新建页面案例: 1. 首先,我们需要创建一个FXML文件,其中包含界面的布局。可以使用Scene Builder等工具来设计和生成FXML文件。 2. 在FXML文件中,可以使用各种JavaFX的UI控件,如Label、TextField、Button等,来设计页面的各个组件。 3. 在Java代码中,可以使用FXMLLoader类来加载FXML文件,并将其与一个Controller类关联起来。Controller类负责处理界面中的各种事件和交互逻辑。 4. 在Controller类中,可以使用@FXML注解来标记FXML文件中的各个UI控件,从而在代码中引用它们。 5. 在Controller类中,可以定义各种方法来处理界面中的事件,例如,当点击按钮时执行一些操作。可以使用@FXML注解来将这些方法与FXML文件中的相应控件的事件关联起来。 6. 数据新建页面通常包含一个表单,用户可以填写各种字段。可以在Controller类中定义相应的属性,然后将其与FXML文件中的文本框等控件绑定起来,以便实现双向绑定。 7. 当用户点击保存按钮时,可以调用相应的方法来处理保存操作,例如将数据保存到数据库或文件中。 通过以上步骤,我们可以创建一个简单的JavaFX数据新建页面。使用JavaFX的优势在于它提供了强大的UI控件和布局容器,可以轻松实现各种界面效果,并且与Java的其他部分(例如数据处理逻辑)很好地结合在一起。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值