JavaFX:stage.setOnCloseRequest()不工作。

问题描述 投票:0回答:1

我有一个主窗口,上面打开一个错误对话框。这时,在主窗口和错误对话框之间会显示一个覆盖层(主窗口阶段的一部分)。mainWindowOverlay.setManaged(true)当关闭错误对话框时,覆盖层应该消失。errorStage.setOnCloseRequest(we -> overlayOff())我不知道是关闭事件没有注册还是有其他问题,但错误对话框关闭后,覆盖层仍然存在。

有什么好办法吗?

controllerMainWindow.java

package packageA;
import [...];

public class controllerMainWindow extends AbstractController
{
    @FXML
    private AnchorPane mainWindowOverlay;
    @FXML
    private Button btnError;
    //---------------------------------------------------------------------------------------------------
    public void initialize()
    {
        mainWindowOverlay.setManaged(false);
    }
    //---------------------------------------------------------------------------------------------------
    @FXML
    public void handleButtonAction(ActionEvent event)
    {
            try {
                if (event.getSource().equals(btnError)) {
                    FXMLLoader errorLoader = new FXMLLoader();
                    errorLoader.setLocation(getClass().getResource("errorDialog.fxml"));
                    controllerErrorDialog errorController = new controllerErrorDialog();
                    errorLoader.setController(errorController);
                    Parent layout;
                    layout = errorLoader.load();
                    Scene errorScene = new Scene(layout);
                    Stage errorStage = new Stage();
                    errorStage.initStyle(StageStyle.UNDECORATED);
                    errorController.setStage(errorStage);
                    if(this.main!=null) {
                        errorStage.initOwner(main.getPrimaryStage());
                    }
                    customerServiceOverlay.setManaged(true);
                    errorStage.initModality(Modality.APPLICATION_MODAL);
                    errorStage.setScene(errorScene);
                    errorStage.setX(750);
                    errorStage.setY(425);
                    errorStage.setOnCloseRequest(we -> overlayOff());
                    errorStage.showAndWait();
                }
            } catch (IOException exceptionHandleButtonAction) {
                System.out.println("Error on handleButtonAction.");
                exceptionHandleButtonAction.printStackTrace();
                return;
            }
    }
    //---------------------------------------------------------------------------------------------------
    public void overlayOff()
    {
        customerServiceOverlay.setManaged(false);
    }
    //---------------------------------------------------------------------------------------------------
}

控制器ErrorDialog.java

package packageA;
import [...];

public class controllerErrorDialog extends AbstractController implements Initializable {
    @FXML
    private Button btnClose;
    @FXML
    private Stage stage = null;
    //---------------------------------------------------------------------------------------------------
    @Override
    public void initialize(URL url, ResourceBundle rb)
    {

    }
    //---------------------------------------------------------------------------------------------------
    public void setStage(Stage stage)
    {
        this.stage = stage;
    }
    //---------------------------------------------------------------------------------------------------
    @FXML
    public void handleButtonAction(ActionEvent event)
    {
        stage.fireEvent(new javafx.stage.WindowEvent(stage, 
        javafx.stage.WindowEvent.WINDOW_CLOSE_REQUEST));
        stage.close();
    }
    //---------------------------------------------------------------------------------------------------
}
java javafx event-listener
1个回答
0
投票

解决方案由 @James_D 和 @anko 提供。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.