2017-03-16 4 views
0

J'ai ma scène créée avec JavaFX Scene Builder et ListView. Je veux qu'il montre quelques données du dossier de xml, mais je n'ai aucune idée comment initialiser correctement ce ListView. Cela me donne évidemment une exception NullPointerException parce qu'elle n'est pas initialisée. J'ai essayé d'ajouterComment initialiser ListView à partir d'un fichier FXML?

driversLV = new ListView<String>(observableList); 

et aucune erreur alors, mais ListView est encore vide dans l'interface graphique.

System.out.println(driversLV); 

donne:

[email protected][styleClass=list-view] 

Donc, ma question est: quelle est la bonne façon d'initialiser ListView? Est-ce que mon code est correct malgré cela?

Répondre

2

D'abord, ne faites rien ici de statique. Le contrôleur est un objet associé à l'interface utilisateur chargée à partir du fichier FXML. Les champs et les méthodes doivent donc être membres de cet objet et non de la classe. (Et le FXMLLoaderwill not initialize static fields.)

Deuxièmement, annoter les champs déclarés dans le fichier FXML avec @FXML. Cela permettra au FXMLLoader de les initialiser même si vous les déclarez privés (ce que vous devriez faire). Assurez-vous que le fx:id affecté au contrôle dans le fichier FXML est le même que le nom du champ.

Enfin, le FXMLLoader créera (par défaut) une instance de votre classe de contrôleur en appelant son constructeur sans argument, puis il initialisera les champs. Par conséquent, bien sûr, ils ne seront pas initialisés lorsque le constructeur est appelé. Au lieu de cela, utilisez la méthode initialize(), que le FXMLLoader appellera automatiquement une fois que les champs @FXML -annotated ont été injectés.

Vous devriez avoir

public class MainDriversController{ 

    @FXML 
    private ListView<String> driversLV; 

    private ObservableList<String> observableList = FXCollections.observableArrayList(); 

    public void initialize(){ 
     for(int x=0; x<Cparsing.driversNodes.getLength(); x++) { 
      observableList.add(Cparsing.driversNodes.item(x).getAttributes().getNamedItem("nick").getNodeValue()); 
     } 
     driversLV.setItems(observableList); 
     System.out.println(driversLV); 
    } 
} 

Et bien sûr votre fichier FXML aurez fx:controller="my.package.name.MainDriversController" dans l'élément racine, et

<ListView fx:id="driversLV" /> 

comme un élément quelque part.

+0

Thaaaaaaaaaah vous! J'essayais de nombreuses méthodes depuis hier et c'était juste la méthode initialize()! :) – Sheb