IntelliJ verwenden Ich habe eine JavaFX-Anwendung erstellt und dann Kotlin und Maven als Frameworks hinzugefügt. Es kam mit einer sample.fxml-Datei und einem Controller.java und Main.java. Ich habe eine neue Klasse für den Controller in Kotlin (MainWindowController.kt) erstellt und die Datei sample.fxml in MainWindow.fxml umbenannt. Ich die MainWindow.fxml aktualisiert wie folgt aussehen:FXML-Steuerelement immer null bei Verwendung von Kotlin
<?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>
Und in meiner MainWindowController.kt Datei ich habe:
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}")
}
}
Hier ist mein 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);
}
}
Wenn ich laufen Die App zeigt in der Druckzeile an, dass das Label null ist, aber ansonsten wird das Fenster korrekt angezeigt und ich sehe den Text von meinem Label. Die Null ist das Problem, das ich habe. Ich habe nicht viel über die Verwendung von FXML mit Kotlin gefunden, und was ich gefunden habe, war etwas veraltet und schien keine wirklich funktionierende Lösung zu haben.
Weiß jemand, warum das Label null ist? Ich muss etwas falsch machen oder etwas falsch verstehen.
Edit: Hier ist, was ich habe, dass jetzt dank der schnellen Antworten funktioniert:
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}")
}
}
ich Kotlin weiß nicht: ist das 'init' Verfahren als Teil der Objektkonstruktion genannt? –
Sie sollten [TornadoFX] (https://github.com/edvin/tornadofx) auschecken. Es macht JavaFX in Kotlin wirklich nett und hat sichere DSLs für das Layout und die Stile. –
Um @ RuckusT-Booms Kommentar hinzuzufügen, unterstützt es auch FXML und rationalisiert es sehr schön. https://github.com/edvin/tornadofx-guide/blob/master/Part%202%20-%20Usage%20Basics/10.%20FXML.md – tmn