在再次打开阶段之前,请检查阶段是否已经打开

时间:2018-10-07 21:46:42

标签: java javafx

我试图通过单击一个按钮来打开一个舞台,但是在打开它之前,我想检查该舞台是否已经打开,然后将打开的舞台弹出到最前面,而不是打开一个新的舞台(没有多重打开同一阶段)。

@FXML
private void btn_Validate(ActionEvent event) {

    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/scontrols/students/StudentManagement.fxml"));
        Parent root = (Parent) loader.load();

        StudentManagementController sendTo =  loader.getController();
        sendTo.receiveFromCamera(txtPictureName.getText());
        Stage stage = new Stage();
        stage.setScene(new Scene(root));
         if(!stage.isShowing())
         {
             stage.show();}

    } catch (IOException ex) {
        Logger.getLogger(WebCamController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

1 个答案:

答案 0 :(得分:0)

您正在检查新创建的 !stage.isShowing()上的Stage。这将永远不会做您想要的。您需要保留对另一个Stage的引用,并继续使用该引用。

public class Controller {

  private Stage otherStage;

  @FXML
  private void btn_Validate(ActionEvent event) {
    if (otherStage == null) {
      Parent root = ...;

      otherStage = new Stage();
      otherStage.setScene(new Scene(root));
      otherStage.show();

    } else if (otherStage.isShowing()) {
      otherStage.toFront();
    } else {
      otherStage.show();
    }

}

如果Stage在关闭时不希望保留在内存中,则可以稍作改动。

public class Controller {

  private Stage otherStage;

  @FXML
  private void btn_Validate(ActionEvent event) {
    if (otherStage == null) {
      Parent root = ...;

      otherStage = new Stage();

      otherStage.setOnHiding(we -> otherStage = null);

      otherStage.setScene(new Scene(root));
      otherStage.show();

    } else {
      otherStage.toFront();
    }

}

根据您的需要,您可能还希望存储对已加载控制器的引用。