2017-05-23 105 views
2

我有一個TreeTableView<MyCustomRow>,我想動態添加列。在MyCustomRow我有一個Map<Integer, SimpleBooleanProperty>與行中的值。我以這種方式添加新列:JavaFx動態列值

private TreeTableColumn<MyCustomRow, Boolean> newColumn() { 
    TreeTableColumn<MyCustomRow, Boolean> column = new TreeTableColumn<>(); 
    column.setId(String.valueOf(colNr)); 
    column.setPrefWidth(150); 
    column.setCellValueFactory(data -> data.getValue().getValue().getValue(colNr)); 
    column.setCellFactory(factory -> new CheckBoxTreeTableCell()); 
    column.setEditable(true); 
    colNr++; 
    return column; 
} 

然後table.getColumns().add(newColumn())

問題是,當我連續檢查一個CheckBox時,該行中的所有複選框都被檢查。這裏是我行的代碼:

public class MyCustomRow { 
    private Map<Integer, SimpleBooleanProperty> values = new HashMap<>(); 

    public MyCustomRow(Map<Integer, Boolean> values) { 
     values.entrySet().forEach(entry -> this.values 
       .put(entry.getKey(), new SimpleBooleanProperty(entry.getValue()))); 
    } 

    public SimpleBooleanProperty getValue(Integer colNr) { 
     if (!values.containsKey(colNr)) { 
      values.put(colNr, new SimpleBooleanProperty(false)); 
     } 
     return values.get(colNr); 
    } 

} 

所以我設置取決於colNr單元格的值,我也試着調試和似乎值在values地圖不同,所以我不知道爲什麼所有的複選框都選中時只檢查一個。

回答

2

在這一行,

column.setCellValueFactory(data -> data.getValue().getValue().getValue(colNr)); 

中示出了細胞時,處理程序被調用。因此,所有colNr都是最新的值,最後一個索引的布爾屬性與所有單元格相關聯。

要撥打與在newColumn()時的值調用處理程序,例如:

final Integer colNrFixed = colNr; 
column.setCellValueFactory(data -> data.getValue().getValue().getValue(colNrFixed)); 
// ... 
colNr++; 
+0

非常感謝你,它工作得很好:) – Sunflame