由于之前图省事在弹窗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向弹窗传值