2017-07-04 21 views
0

テーブルの初期化に問題があります。 私はまずプログラムを起動し、後でデータをロードしたいと思っています。これが正常に動作し、プログラムをロードすべてのコントローラを初期化しますJavaFX TableColumn.setCellValueFactory()がnullポインタをスローする

Main.java:

は、私は次のセットアップを得ました。 これは、データがロードされた場合にデータをロードしてリストに格納する機能も保持します。

TableViewController.java私のプログラムの1つのタブは、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()); 
} 

私は、Eclipseのデバッガを使用してupdateContentsにブレークポイントを設定columnOne.SetCellValueFactory;

の行の

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

を取得しています、私の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 done :) – Daniel

+0

'tableViewController'と' TableViewController'は2つの異なる変数であるようです。どうして?両方の変数に同じコントローラインスタンスが含まれていますか? 'TableView.refresh'(JavaFX 8u60 +)を使う方が簡単かもしれません。さらに、 'myObjectObservableList'がテーブルの' items'として設定されている場合、テーブルを手動で更新する必要はありません。 – fabian

答えて

0

クールへエステーションそのもの。

ありがとうございます!

関連する問題