2012-09-20 77 views
3

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; 
     } 
    }); 
}  

但是,作爲一個結果,我剛纔的空行我的表,用點擊一些細胞和收到表格編輯控制的能力。但是桌子上沒有瑕疵價值; 我在做什麼我的代碼錯了?

+0

我試圖把你的代碼放到一個類中,讓它編譯但沒有成功。行#getColumns應該返回一列列的權利,但在#createTableBody它被添加到ObservableList <列表>。也許使用屬性的二維數組會簡化一些事情? –

+0

createTableHeader方法中的表列正在作爲makeCellFactory參數傳遞?如果是這樣,很自然地只期望最後一種行爲,因爲我相信一個TableColumn只能有一個cellFactory。如果你設置了兩次,最後一個將是有效的 –

回答

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()); 
    } 
});