Как создать собственное всплывающее окно, используя f xml в javafx? - PullRequest
0 голосов
/ 05 февраля 2020

GUI example

, чтобы создать новую версию, пользователю будет предложено нажать на кнопку «плюс» в левом нижнем углу GUI, когда он нажмет на эту I Я хочу, чтобы панель, наложенная на верхнюю часть центра GUI, позволяла пользователям вводить настройки и указывать параметры для новой версии. Я пробовал это:

 private void addRelease(Event event) throws IOException {
     Popup popup = new Popup();
    NewReleasePopupController controller = new NewReleasePopupController();
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Resources/NewReleasePopup.fxml"));
    loader.setController(controller);
    loader.load();
    popup.getContent().add((Parent)loader.load());
}

, однако при загрузке возникают ошибки Я хотел бы избежать загрузки отдельного этапа, если это возможно, и хотел бы, чтобы контроллер для всплывающего окна был вложен в контроллер для основного этапа. Я попробовал использовать класс всплывающих окон, если кто-то может помочь мне заставить это работать или есть какие-то лучшие способы добиться этой помощи, будет высоко ценится !!

ошибка:

Caused by: javafx.fxml.LoadException: Controller value already specified.

/ D : /DropDayAIO/out/production/DropDayAIO/DropDayAIO/Resources/newReleasePopup.fxml: 6

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at DropDayAIO.HomeSceneController.addRelease(HomeSceneController.java:151)
at DropDayAIO.HomeSceneController.addNewRelease(HomeSceneController.java:128)
... 57 more

1 Ответ

1 голос
/ 06 февраля 2020

Судя по упомянутой вами ошибке, у вас уже есть объявление контроллера в файле F XML. как с атрибутом .. fx:controller

Обычно при наличии этого объявления атрибута в f xml, если вы попытаетесь установить контроллер снова, он выдаст Caused by: javafx.fxml.LoadException: Controller value already specified

И я считаю, что это должно может быть, потому что вы можете заметить, что ошибка возникает в processAttribute метод.

javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)

Вы можете удалить его из f xml или не нужно установить в коде (через setController ()). Если вы говорите, что вам нужна ссылка на контроллер, вы всегда можете пройти через loader.getController().

И в довершение всего, если вам удастся устранить ошибку Controller value already specified, я думаю, что дальше вы встретите Caused by: javafx.fxml.LoadException: Root value already specified .Потому что вы пытаетесь вызвать метод load () FXMLLoader два раза. Присвойте узел переменной и используйте эту переменную для установки во всплывающем окне.

Я полагаю, что приведенный ниже код должен решить проблему. Попробуйте !!

private void addRelease(Event event) throws IOException {
     Popup popup = new Popup();
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Resources/newReleasePopup.fxml"));
    Parent parent = (Parent)loader.load(); // I am not sure you need a cast here
    newReleasePopupController controller = loader.getController();
    popup.getContent().add(parent);
}

Предложение: Пожалуйста, используйте правильные правила именования класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...