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();
}
'TableColumn'の作成を含むfxml、fxmlをロードしているjavaコードの部分、' updateContents'を呼び出す部分からスニペットを投稿できますか? – fabian
@fabian done :) – Daniel
'tableViewController'と' TableViewController'は2つの異なる変数であるようです。どうして?両方の変数に同じコントローラインスタンスが含まれていますか? 'TableView.refresh'(JavaFX 8u60 +)を使う方が簡単かもしれません。さらに、 'myObjectObservableList'がテーブルの' items'として設定されている場合、テーブルを手動で更新する必要はありません。 – fabian