О FXML Java. Пытаясь понять основы
Я создал приложение, которое отлично работает, и мне пришлось сделать кучу обходных путей, чтобы справиться с вещами "не на FX-потоке", но в целом я думаю, что справился с этим неплохо. В любом случае, сейчас я хочу сделать это приложение v2.0 первым, которое я сделал, намного лучше с тем, что я узнал до сих пор.
Одна из вещей, которая до сих пор сбивает меня с толку, - это просто НАЧАТЬ проект, используя netBeans, когда я запускаю свой проект FXML, мне предоставляют 3 документа:
FXMLDocument.fxml
FXMLDocumentController.java
(имя приложения).java
Теперь я понимаю первые два, они связаны друг с другом, и в основном контроллер просто заставляет работать все элементы GUI, созданные в документе FXML, однако я не могу связать третий файл, (app name).java файл, он содержит методы start и main, которые всегда вызываются, и загружает оттуда файл FXML, однако у моего первого приложения в этом файле не было ни одной строки (кроме тех, которые уже были при запуске нового проекта), я думаю, что это, вероятно, не очень хорошая практика.
Мой вопрос, имея эти 3 файла, как я могу соединить FXMLController с файлом (app name).java? например, если я нажимаю кнопку, как я могу заставить ее делать что-то, что закодировано в файле (app name).java вместо файла FXMLController? это вообще возможно?
1 ответ
Файл (имя приложения).java - это ваш основной класс, это точка входа для вашего приложения, этот класс будет вызывать FXML, а затем FXML вызывает контроллер.
Чтобы получить доступ к вашему FXMLController, вам нужно убедиться, что он загружен первым, вы не можете получить к нему доступ, прежде чем он будет вызван на сцену (он вернется с nullExceptionError).
после того, как он загружен на сцену, вы можете вызвать его через:
private final FXMLLoader fxml = new FXMLLoader(getClass().getResource("fxmlnamehere.fxml"));
public void start(Stage mainStage) throws Exception {
fxmlcontent = fxml.load();
root = new Scene(fxmlcontent,width,height);
mainStage.setScene(root);
mainStage.show();
FXMLDocumentController controller = fxml.<FXMLDocumentController>getController();
}
это сделает controller
то, что вы бы назвали для доступа к информации в вашем классе FXMLDocumentController, просто чтобы заметить, что FXMLDocumentController будет заменено именем вашего класса контроллера, как бы вы его ни называли.
сделать функцию в вашем.java-файле (имя приложения) из класса контроллера намного проще, убедитесь, что функция, которую вы хотите использовать, общедоступна, чем в классе контроллера appName.functionName();
это выполнит функцию functionName (), которая находится внутри appName (aka (имя приложения).java).