2017-03-16 167 views
0

我有我的場景用JavaFX Scene Builder和ListView製作。我希望它顯示來自xml文件的一些數據,但我不知道如何正確初始化這個ListView。如何從FXML文件初始化ListView?

import javafx.collections.ObservableList; 
import javafx.scene.control.ListView; 
import application.Cparsing; 
import javafx.collections.*; 

public class MainDriversController{ 
    private static ListView<String> driversLV; 
    static ObservableList<String> observableList = FXCollections.observableArrayList(); 

    public static void SetListView(){ 
     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); 
    } 
} 

這當然給我NullPointerException,因爲它沒有初始化。 我試着添加

driversLV = new ListView<String>(observableList); 

並沒有錯誤的話,但是ListView控件依然在GUI空。

System.out.println(driversLV); 

給出:

[email protected][styleClass=list-view] 

所以我的問題是:什麼是初始化ListView控件的正確方法?儘管如此,我的代碼是否正確?

回答

2

首先,這裏不要做任何事情。控制器是與從FXML文件加載的UI關聯的對象,所以字段和方法需要是該對象的成員,而不是該類的成員。 (和FXMLLoaderwill not initialize static fields。)

其次,用@FXML註釋在FXML文件中聲明的字段。這將允許FXMLLoader初始化它們,即使你聲明它們是私有的(你應該這樣做)。確保分配給FXML文件中控件的fx:id與字段名稱相同。

最後,FXMLLoader將(默認情況下)通過調用它的無參數構造函數來創建控制器類的實例,然後它將初始化這些字段。因此,當構造函數被調用時,它們不會被初始化。相反,使用initialize()方法,FXMLLoader將在已注入@FXML-annotated字段後自動調用該方法。

所以,你應該有

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); 
    } 
} 

當然你FXML文件將在根元素fx:controller="my.package.name.MainDriversController",並

<ListView fx:id="driversLV" /> 

爲元素的地方。

+0

Thaaaaaaaaaaank你!從昨天開始嘗試了很多方法,它只是initialize()方法! :) – Sheb