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對象中;
下面是一些代碼,香港專業教育學院試圖彌補這方面的目的:
//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;
}
});
}
但是,作爲一個結果,我剛纔的空行我的表,用點擊一些細胞和收到表格編輯控制的能力。但是桌子上沒有瑕疵價值; 我在做什麼我的代碼錯了?
我試圖把你的代碼放到一個類中,讓它編譯但沒有成功。行#getColumns應該返回一列列的權利,但在#createTableBody它被添加到ObservableList <列表>。也許使用屬性的二維數組會簡化一些事情? –
createTableHeader方法中的表列正在作爲makeCellFactory參數傳遞?如果是這樣,很自然地只期望最後一種行爲,因爲我相信一個TableColumn只能有一個cellFactory。如果你設置了兩次,最後一個將是有效的 –