2017-07-04 67 views
0

我遇到了初始化我的一個表的問題。 我首先啓動我的程序,並希望稍後加載數據。JavaFX TableColumn.setCellValueFactory()拋出空指針

我得到了以下設置:

Main.java:初始化程序並加載所有的控制器,這工作正常。 它也具有加載數據的功能,如果這樣做,它將被存儲在列表中。

TableViewController.java控制我程序中的一個Tab,其中包含TableView

setMain在程序啓動時在我的Main.java中調用。

@FXML 
private TableView<MyObject> tableView; 
@FXML 
private TableColumn<MyObject, String> columnOne; 
@FXML 
private TableColumn<MyObject, Integer> columnTwo; 
@FXML 
private TableColumn<MyObject, String> columnThree; 

public void setMain(Main main) { 
    this.main = main; 
    tableView.setItems(main.getMyObjectObservableList()); 
} 

public void updateContents() {  
    columnOne.setCellValueFactory(value->value.getValue().getType()); 
    columnTwo.setCellValueFactory(value->value.getValue().getTotal().asObject()); 
    columnThree.setCellValueFactory(value->value.getValue().getTrend()); 
} 

我越來越

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
Caused by: java.lang.NullPointerException 

行的columnOne.SetCellValueFactory;

我用Eclipse調試器,並在updateContents設置斷點,我TableView對象充滿了數據,被加載。

爲什麼拋出異常?

EDIT1:

FXML:

<TableView fx:id="tableView"> 
       <columns> 
        <TableColumn fx:id="columnOne" prefWidth="411.0" text="title" /> 
        <TableColumn fx:id="columnTwo" maxWidth="335.0" minWidth="-1.0" prefWidth="188.0" /> 
        <TableColumn fx:id="columnThree" maxWidth="335.0" minWidth="-1.0" prefWidth="188.0" /> 
       </columns> 
       </TableView> 

加載FXML:

public void initTable() { 
    try { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Main.class.getResource("view/Table.fxml")); 
     AnchorPane table = (AnchorPane) loader.load(); 

     Tab t = new Tab(); 
     t.setText("Table"); 
     t.setContent(table); 

     mainTabPane.getTabs().add(t); 

     tableViewController = loader.getController(); 
     tableViewController.setMain(this); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

更新內容:

public void loadData(File[] files) throws IOException { 
//loading data here 
myObjectObservableList.add(new MyObject(params)); 
TableViewController.updateContents(); 
} 
+0

你可以發佈包含'TableColumn'創建的fxml片段,你正在加載fxml的Java代碼部分和你調用'updateContents'的部分? – fabian

+0

@fabian完成:) – Daniel

+0

'tableViewController'和'TableViewController'好像是2個不同的變量。爲什麼?你確定兩個變量都包含相同的控制器實例嗎?此外,使用'TableView.refresh'(JavaFX 8u60 +)可能更簡單。此外,如果'myObjectObservableList'設置爲表的'items',則不需要手動刷新表... – fabian

回答

0

的問題是在一個評論回答了費邊到曲estion本身。

謝謝!