Аннотация @FXML
указывает поле, которое должно быть инициализировано FXMLLoader
для ссылки на объекты, созданные в соответствии с элементами в файле FXML при загрузке файла FXML. Следовательно:
- Имеет смысл аннотировать поля
@FXML
, только если они соответствуют элементам в файле FXML
- Это никогда имеет смысл инициализировать поле, если оно аннотировано
@FXML
(потому что FXMLLoader
должно его инициализировать)
Ваше DialogController
поле
@FXML
private DialogController controller = new DialogController();
не имеет смысла по обеим этим причинам: в sample.fxml
нет элемента DialogController
, и если бы он был, не было бы смысла инициализировать поле.
Контроллер - это определенный объект , связанный с пользовательским интерфейсом, загруженным из файла FXML. Ассоциация устанавливается FXMLLoader
при загрузке файла FXML. Если вы загружаете файл FXML несколько раз (как вы, похоже, делаете здесь, поскольку вы загружаете newDialog.fxml
в обработчик событий), то (конечно) вы каждый раз получаете новые экземпляры всех элементов в FXML, и, следовательно, каждый раз новый экземпляр класса контроллера.
Объект, который вы создаете с помощью
@FXML private DialogController controller = new DialogController();
не является контроллером для любого пользовательского интерфейса, загруженного в любое время, когда вы загружаете newDialog.fxml
; это просто еще один объект того же класса. Не ясно, ожидаете ли вы, что это поле будет каким-либо образом ссылаться на контроллер, созданный при первом выборе пользователем "New"
из меню, или на тот, который был создан при втором выборе этого пункта меню, и т. Д. Или, конечно, как вы ожидается, что он будет ссылаться на любой из этих контроллеров, когда вы инициализируете его до того, как загрузите newDialog.fxml
.
Вы получаете контроллер от FXMLLoader
после загрузки FXML. Так что вам просто нужно:
public class Controller {
@FXML
private BorderPane mainBorderPane;
@FXML
public void initialize(){
}
@FXML
public void newItemDialog(){
Dialog <ButtonType> dialog = new Dialog<>();
dialog.initOwner(mainBorderPane.getScene().getWindow());
dialog.setTitle("Insert Word");
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("newDialog.fxml"));
try{
dialog.getDialogPane().setContent(fxmlLoader.load());
}catch(IOException e) {
e.printStackTrace();
return;
}
dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
Optional<ButtonType> result = dialog.showAndWait();
DialogController controller = fxmlLoader.getController();
if(result.isPresent() && result.get() == ButtonType.OK){
boolean results = controller.processResults();
}else{
System.out.println("Cancelled");
return;
}
}
}