次のように、セル値ファクトリをすべての列に設定する必要があります。
TableColumn<ObservableList<String>, String> studentIDCol = new TableColumn<>("Student ID");
studentIDCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(0));
}
});
また、クエリが JavaFX スレッドをブロックするため、クエリをサービスに抽出することをお勧めします。http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htmを確認してください。
この完全な例をテスト データで確認してください。
public void start(Stage stage) throws Exception {
VBox vbox = new VBox(10.0);
vbox.setAlignment(Pos.CENTER);
final TableView<ObservableList<String>> table = new TableView<>();
TableColumn<ObservableList<String>, String> studentIDCol = new TableColumn<>("Student ID");
studentIDCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(0));
}
});
TableColumn<ObservableList<String>, String> nameCol = new TableColumn<>("Name");
nameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(1));
}
});
TableColumn<ObservableList<String>, String> addressCol = new TableColumn<>("Address");
addressCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(2));
}
});
TableColumn<ObservableList<String>, String> ageCol = new TableColumn<>("Age");
ageCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(3));
}
});
TableColumn<ObservableList<String>, String> contactnoCol = new TableColumn<>("Contact Number");
contactnoCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(4));
}
});
table.getColumns().add(studentIDCol);
table.getColumns().add(nameCol);
table.getColumns().add(addressCol);
table.getColumns().add(ageCol);
table.getColumns().add(contactnoCol);
final ProgressBar bar = new ProgressBar(-1);
bar.setVisible(false);
final Button button = new Button("Fill");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
final Service<ObservableList<ObservableList<String>>> service = new Service<ObservableList<ObservableList<String>>>() {
@Override
protected Task<ObservableList<ObservableList<String>>> createTask() {
return new Task<ObservableList<ObservableList<String>>>() {
@Override
protected ObservableList<ObservableList<String>> call() throws Exception {
ObservableList<ObservableList<String>> items = FXCollections.observableArrayList();
items.add(FXCollections.observableArrayList("1", "2", "3", "4", "5"));
items.add(FXCollections.observableArrayList("1", "2", "3", "4", "5"));
items.add(FXCollections.observableArrayList("1", "2", "3", "4", "5"));
//Here the code for the query
Thread.sleep(5000);//To see the progress
return items;
}
};
}
};
bar.visibleProperty().bind(service.runningProperty());
button.disableProperty().bind(service.runningProperty());
table.itemsProperty().bind(service.valueProperty());
service.start();
}
});
vbox.getChildren().addAll(table, button, bar);
Scene scene = new Scene(vbox, 300, 300);
stage.setScene(scene);
stage.show();
}
FXML ファイルを使用している場合。TableColumn の初期化手順をスキップする必要があります。
@FXML アノテーションを使用して、コントローラ クラスのファイル内のフィールドとして TableColumn を宣言します。javafx.fxml.Initializable を実装していることを確認してください。また、初期化メソッドでは、すべての列の構成側を実行できます。また、列は既にテーブル ビューにあるため、テーブルへの列の追加は避けてください。
FXML で TableView を次のように定義している場合のサンプルを次に示します。
<TableView layoutX="145.0" layoutY="76.0" prefHeight="200.0" prefWidth="200.0">
<columns>
<TableColumn prefWidth="75.0" text="Student ID" fx:id="studentIDCol" />
<TableColumn prefWidth="75.0" text="Name" fx:id="nameCol" />
<TableColumn prefWidth="75.0" text="Address" fx:id="addressCol" />
<TableColumn prefWidth="75.0" text="Age" fx:id="ageCol" />
</columns>
</TableView>
次に、コントローラークラスは次のようになります。
class YourTest implements javafx.fxml.Initializable{
//More Code
@FXML
TableColumn<ObservableList<String>, String> studentIDCol;
@FXML
TableColumn<ObservableList<String>, String> nameCol;
@FXML
TableColumn<ObservableList<String>, String> addressCol;
@FXML
TableColumn<ObservableList<String>, String> ageCol;
//More of your code
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
studentIDCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(0));
}
});
nameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(1));
}
});
addressCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(2));
}
});
ageCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(3));
}
});
contactnoCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList<String>,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList<String>, String> cdf) {
return new SimpleStringProperty(cdf.getValue().get(4));
}
});
}
//More of your Code
}
それが役に立てば幸い。