我想创建一个通用的方法来创建一个特定的对话框。
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"
我该如何解决?谢谢。
我不是很有经验。那说
答案 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
}