使用Javafx创建一个通用的Dialog方法

时间:2017-10-08 21:38:13

标签: java javafx dialog

我想创建一个通用的方法来创建一个特定的对话框。

private void setDialog(String dialog,String title){
    try {
        // Load the fxml file and create a new stage for the popup
        FXMLLoader loader = new FXMLLoader(Main.class.getResource("/view/" + dialog + ".fxml"));
        AnchorPane page = (AnchorPane) loader.load();
        Stage dialogStage = new Stage();
        dialogStage.setTitle(title);
        dialogStage.initModality(Modality.WINDOW_MODAL);
        dialogStage.initOwner(Main.getPs());
        Scene scene = new Scene(page);
        dialogStage.setScene(scene);


     loader.getController().setDialogStage(dialogStage);

        // Show the dialog and wait until the user closes it
        dialogStage.showAndWait();


      } catch (IOException e) {
        // Exception gets thrown if the fxml file could not be loaded
        e.printStackTrace();
      }

}

但是我在这一行中收到错误

loader.getController().setDialogStage(dialogStage)

错误就是这个

"The method setDialogStage(Stage) is undefined for the type Object"

我该如何解决?谢谢。

我不是很有经验。那说

2 个答案:

答案 0 :(得分:1)

假设您有一些定义MyController方法的控制器类setDialogStage(Stage),您可以

loader.<MyController>getController().setDialogStage(dialogStage);

这并不比简单的演员更安全;如果控制器的类型不正确,它将在运行时失败ClassCastException

如果您有多个可能具有此方法的控制器,最好的选择可能是让它们实现定义相关方法的接口:

public interface DialogController {

    public void setDialogStage(Stage dialogStage);

}

您的控制器看起来像

public class MyController implements DialogController {

    // ...

    @Override
    public void setDialogStage(Stage dialogStage) {
         // ...
    }

}

然后您只需将控制器视为一般DialogController

loader.<DialogController>getController().setDialogStage(dialogStage);

答案 1 :(得分:1)

虽然您可能有充分的理由创建自己的对话框机制,但我想指出JavaFX已经有standard way对话框。

网站code.makery显示了一些如何创建对话框的示例:

Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText("Look, a Confirmation Dialog");
alert.setContentText("Are you ok with this?");

Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
    // ... user chose OK
} else {
    // ... user chose CANCEL or closed the dialog
}

Confirmation dialog

您还可以使用自定义内容创建对话框: Exception Dialog