Uso di IntelliJ Ho creato un'applicazione JavaFX e poi ho aggiunto Kotlin e Maven come framework. È arrivato con un file sample.fxml e un controller.java e Main.java. Ho creato una nuova classe per il controller in Kotlin (MainWindowController.kt) e rinominato il file sample.fxml in MainWindow.fxml. Ho aggiornato il MainWindow.fxml a guardare come:Controllo FXML sempre nullo quando si utilizza 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>
E nel mio file MainWindowController.kt ho:
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}")
}
}
Ecco la mia 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);
}
}
Quando eseguo l'app la linea di stampa mostra che l'etichetta è nullo ma in caso contrario la finestra mostra correttamente e vedo il testo dalla mia etichetta. Il nullo è il problema che sto avendo. Non ho trovato molto sull'uso di FXML con Kotlin e quello che ho trovato era un po 'obsoleto e non sembrava avere una soluzione funzionante.
Qualcuno sa perché l'etichetta è nullo? Devo fare qualcosa di sbagliato o fraintendere qualcosa.
Edit: Ecco quello che ho che ora funziona grazie alle risposte rapide:
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}")
}
}
non so Kotlin: è il metodo 'init' chiamato come parte della costruzione di un oggetto? –
Dovresti controllare [TornadoFX] (https://github.com/edvin/tornadofx). Rende JavaFX in Kotlin davvero bello e ha DSL sicuri per tipo sia per il layout che per gli stili. –
Per aggiungere al commento di @RuckusT-Boom, supporta anche FXML e lo ottimizza molto bene. https://github.com/edvin/tornadofx-guide/blob/master/Part%202%20-%20Usage%20Basics/10.%20FXML.md – tmn