2017-03-16 1 views
0

JavaFX 장면 빌더 및 ListView로 만든 내 장면이 있습니다. 내가 XML 파일에서 일부 데이터를 표시하고 싶지만이 ListView를 제대로 초기화하는 방법을 알지 못합니다.어떻게 ListView를 FXML 파일에서 초기화 할 수 있습니까?

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은 (기본값으로) 인수가없는 생성자를 호출하여 컨트롤러 클래스의 인스턴스를 만든 다음 필드를 초기화합니다. 결과적으로 생성자가 호출 될 때 초기화되지 않습니다. 대신 FXMLLoader@FXML- 주석 필드가 삽입되면 자동으로 호출되는 initialize() 메서드를 사용하십시오.

그래서 당신은

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

Thaaaaaaaaaaaaank you! 어제부터 많은 메소드를 시도하고 있었고 그것은 단지 initialize() 메소드였습니다! :) – Sheb

관련 문제