使用场景生成器在 window 上设置关闭请求方法

Set on Close Request method on a window using Scene builder

因为我不能使用场景构建器来设置这个方法

我正在尝试获取现在显示的场景的Window并设置方法

public class MainController {
@FXML
    private Button Settings;
    public void initialize() {
     
    Window w =Settings.getScene().getWindow();

    w.setOnCloseRequest(ac->{

            System.out.println("Done");
        });
   }
}

然后我注意到 w = null ...和 ​​get Scene 方法 returns null 也是..

所以 1) 有什么方法可以在不使用(初始化方式)的情况下使用 Scene builder 来实现 2) 我怎样才能修复上面的代码,这样我就可以使用 window ?

不要在 initialize 方法中使用 getScene() ,因为您将得到 null。调用controller的initialize方法时,根元素还没有放到场景中

试试这个:

ChangeListener<Window> windowListener = new ChangeListener<>() {
    @Override
    public void changed(ObservableValue obs, Window oldVal, Window newVal) {
        if (newVal != null) {
            setting.getScene().getWindow().setOnCloseRequest(eh -> System.out.println("Done"));
            setting.getScene().windowProperty().removeListener(this);
        }
    }
};

ChangeListener<Scene> sceneListener = new ChangeListener<>() {
    @Override
    public void changed(ObservableValue obs, Scene oldVal, Scene newVal) {
        if (newVal != null) {
            newVal.windowProperty().addListener(windowListener);
            setting.sceneProperty().removeListener(this);
        }
    }
};

setting.sceneProperty().addListener(sceneListener);

为了避免未使用的侦听器,我在设置setOnCloseRequest后添加了侦听器移除。