Thareは、javaFXドキュメントページのチュートリアルです。この例では、特定のJavaクラスがある場合に、tableViewを作成する方法について説明します。これにより、どの列を作成するかがわかります。(これは、この例ではPersonクラスです)。
しかし、特定のクラスがなく、列の数が時々変わる可能性がある場合はどうなりますか?私の場合、私はそのようなデータ構造を持っています:
class TableData{
List<Row> rows; //A list with all my rows i need to have in my table
}
class Row{
List<Column> columns; //Cells\Columns for every row.
}
class Column{
Attribute attr; //Each column - is somethig like a wrapper for the real data i need to show in a cell;
}
class Attribute{ //My precues data
String name;
SupportingInfo info;
}
class SupportingInfo{//Some supporting fields...
String name;
String value;
//...etc....
}
ですから、私の場合はこれと非常によく似ています。唯一の違いは、上記の場合のデータがjavaFXテーブルでの表現にバインドされていないことです(したがって、誰かがtableViewでこのデータを編集するための追加のコントロールを作成したとしても、そのデータを持つ実際のオブジェクトはそれを認識しません。 )、it(data)は、一部のオブジェクトではなく、一部の文字列のようにテーブルに移動するためです。
したがって、必要なのは、データをテーブルにプッシュし(table.setItems(tableData)など)、いくつかのセットファクトリを設定し、ユーザーがデータを編集できるようにし、この編集されたデータをtableDataオブジェクトに含めることです。
この目的のために作成しようとしたコードは次のとおりです。
//prepare my table
private void createTableHeader(TableView table, List<Attribute> ias) {
int i = 0;
for (final Attribute ia : ias) {
final int j = i;
i++;
TableColumn tc = new TableColumn(ia.getName());
tc.setSortable(true);
tc.setCellValueFactory(new Callback<CellDataFeatures<List<Attribute>, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<List<Attribute>, String> arg0) {
if(arg0.getValue().get(j).getSupportingInfo() == null){
arg0.getValue().get(j).setSupportingInfo(new SupportingInfo());
}
return new SimpleObjectProperty(arg0.getValue().get(j),"value");
}
});
table.getColumns().add(tc);
}
}
//loading some data to my tableView
private void createTableBody(TableView curTable, List<Row> rows) {
ObservableList<List<Attribute>> data = FXCollections.observableArrayList();
for (Row row : rows) {
data.add(row.getColumns());
}
curTable.setItems(data);
}
//this one is to define some extra controls for editing data in a table by users
private void makeCellFactory(TableColumn curTableCol, final Attribute templateIa, final Document doc) {
curTableCol.setCellFactory(new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
final EditingCell cell = new EditingCell(templateIa, doc);
return cell;
}
});
}
しかし、その結果、テーブルに空の行があり、セルをクリックしてテーブル編集コントロールを受け取ることができます。ただし、テーブルごとにデフォルト値はありません。コードで何が間違っているのですか?