如何使用动态数量的列创建表

时间:2012-09-20 17:26:25

标签: data-binding tableview javafx-2

Thare是javaFX文档页面的tutorial。这个例子描述了如何创建tableView,如果你有一些java类,它可以告诉你你将拥有哪些列。 (在这个例子中,这是一个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....
}

所以,我的情况与this one非常相似。 唯一不同的是,上面案例中的数据没有与其在javaFX表中的表示绑定(因此,即使某些人将在tableView中编辑此数据的额外控件,具有该数据的实际对象也永远不会知道它。 ),因为它(数据)像某些字符串一样进入表格,而不像某些对象;

所以,我需要的是将数据推送到表格中(例如: 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;
        }
    });
}       

但是,结果,我的表​​中只有空行,能够单击某个单元格并接收表格编辑控件。但是表格中没有任何贬值; 我的代码中我做错了什么?

1 个答案:

答案 0 :(得分:1)

好的,我找到了一个解决方案: ts.setCellFactory应如下所示:

tc.setCellValueFactory(new Callback<CellDataFeatures<List<Attribute>, SupportingInfo>, ObservableValue<Attribute>>() {
 @Override
 public ObservableValue<Attribute> call(CellDataFeatures<List<Attribute>, SupportingInfo> arg0) {
  return new SimpleObjectProperty(arg0.getValue().get(j),"value",arg0.getValue().get(j));
 }
});

此外,需要此代码来捕获新值并将传入数据放入表中:

tc.setOnEditCommit(new EventHandler<CellEditEvent<List<Attribute>, Attribute>>() {
    @Override
    public void handle(CellEditEvent<List<Attribute>, Attribute> t) { t.getTableView().getItems().get(t.getTablePosition().getRow()).get(j).setSupportingInfo(t.getNewValue().getSupportingInfo());
    }
});