Управление FXML всегда имеет значение при использовании Kotlin

Используя IntelliJ, я создал приложение JavaFX, а затем добавил Kotlin и Maven в качестве фреймворков для него. Он поставляется с файлом sample.fxml и Controller.java и Main.java. Я создал новый класс для контроллера в Kotlin (MainWindowController.kt) и переименовал файл sample.fxml в MainWindow.fxml. Я обновил MainWindow.fxml, чтобы выглядеть так:

<?import javafx.scene.control.Label?> <?import javafx.scene.layout.GridPane?> <GridPane fx:controller="reader.MainWindowController" xmlns:fx="http://javafx.com/fxml" xmlns="http://javafx.com/javafx/8" alignment="center" hgap="10" vgap="10"> <Label fx:id="helloLabel" text="Hello"/> </GridPane> 

И в моем файле MainWindowController.kt у меня есть:

 package reader import javafx.fxml.FXML import javafx.scene.control.Label class MainWindowController { @FXML var helloLabel: Label? = null init { println("Label is null? ${helloLabel == null}") } } 

Вот мой Main.java:

 import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("MainWindow.fxml")); primaryStage.setTitle("My App"); primaryStage.setScene(new Scene(root, 1000, 600)); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 

Когда я запускаю приложение, линия печати показывает, что метка имеет значение NULL, но в противном случае окно отображается правильно, и я вижу текст с моей метки. Нуль – проблема, с которой я сталкиваюсь. Я не очень много разбираюсь в использовании FXML с Kotlin, и то, что я нашел, было немного устаревшим и, похоже, не имело реального рабочего решения.

Кто-нибудь знает, почему метка равна нулю? Я должен что-то делать неправильно или что-то недопонимать.

Редактировать: Вот что я имею, что теперь работает благодаря быстрым ответам:

 package reader import javafx.fxml.FXML import javafx.scene.control.Label class MainWindowController { @FXML var helloLabel: Label? = null fun initialize() { println("Label is null? ${helloLabel == null}") } } 

Так же, как и с конструкторами Java, поля fx:id не будут заполняться раньше, но после init (или в Java – конструктора). Общим решением является реализация интерфейса Initializable (или просто определение метода initialize() ) и дополнительная настройка внутри метода:

 import javafx.fxml.FXML import javafx.scene.control.Label class MainWindowController : Initializable { @FXML var helloLabel: Label? = null override fun initialize(location: URL?, resources: ResourceBundle?) { println("Label is null? ${helloLabel == null}") } } 

Как упоминалось ранее. Проверьте, установлен ли fx: id.

Также возможно использовать модификатор lateinit .

Ваш код может выглядеть так:

 import javafx.fxml.FXML import javafx.scene.control.Label class MainWindowController { @FXML lateinit var helloLabel : Label }