JavaFX8将List <simplestringproperty>绑定到TableColumn以获取大量自定义表格单元格

时间:2018-03-12 13:48:29

标签: java javafx javafx-8 javafx-2

我有一个数据模型&#34;规则&#34; 规则由保存为List的1-x String部分和规则处于活动状态的布尔值组成。

要在我的UI中显示此信息,我想添加一个包含2列的TableView。 第1列应显示规则文本作为一个整体,但需要大量定制。在单元格中,我为每个规则部分添加一个文本字段,然后绑定到StrinProperty(这就是为什么我需要一个字符串属性列表。 2.列应显示一个复选框以激活或停用规则(这没有问题,工作正常)

在我的规则模型具有布尔值isActive标志之前,我使用了Listview,它将整个Rule模型类作为Object。我创建了自己的ListCell实现并覆盖了updateItem(Object item,boolean isEmpty)来自定义单元格如下所示:

enter image description here

我希望第1列中的tablecell能够准确地查看listview中的listcell。 因为ListCell和Tablecell都继承自IndexedCell,所以我认为改变单元格的视觉效果没有问题。

我的问题是将新的数据模型绑定到表:

private TableView<Rule> tvRules;
this.tvRules = new TableView<Rule>();
this.tvRules.setPrefSize(GuiCore.prefWidth * 0.32, GuiCore.prefHeight * 0.32);
this.tvRules.setEditable(true);

headerBoxLbl = new Label("Active"); 
headerBox = new CheckBox();
headerBoxLbl.setGraphic(headerBox);
headerBoxLbl.setContentDisplay(ContentDisplay.RIGHT);
headerBox.setOnAction(e -> this.changeAllActiveBoxes());

rulePartsColumn = new TableColumn<Rule, List<SimpleStringProperty>>("Rule");
rulePartsColumn.setCellFactory((callback) -> new RuleTableCell());
rulePartsColumn.setCellValueFactory(cellData -> cellData.getValue().getRulePartsProperty());
rulePartsColumn.setResizable(false);
rulePartsColumn.prefWidthProperty().bind(this.widthProperty().multiply(0.8));

isActiveColumn = new TableColumn<Rule, Boolean>();
isActiveColumn.setCellValueFactory(cellData -> cellData.getValue().getIsActiveProperty());
isActiveColumn.setCellFactory(cellData -> new CheckBoxTableCell<>());   
isActiveColumn.setResizable(false);
isActiveColumn.prefWidthProperty().bind(this.widthProperty().multiply(0.2));
isActiveColumn.setStyle( "-fx-alignment: CENTER;");
isActiveColumn.setGraphic(headerBoxLbl);

this.tvRules.getColumns().addAll(rulePartsColumn, isActiveColumn);

如您所见,我创建了2个具有TableDataType规则的列,一个具有布尔类型,另一个具有列表作为数据类型。 问题是我没有得到rulePartsColumn与规则模型的绑定: The error i get

我真的不知道如何绑定它所以在单元格中我可以使用List of StringProperties(或SimpleStringProperties)。

供参考我的Model类规则:

public class Rule {

private SimpleListProperty<SimpleStringProperty> ruleParts;
private SimpleBooleanProperty isActive;

public Rule() {
    this(true, Arrays.asList("", "=", ""));
}

public Rule(final boolean isActive, final List<String> ruleParts) {
    this.isActive = new SimpleBooleanProperty(isActive);
    this.ruleParts = new SimpleListProperty<SimpleStringProperty>(FXCollections.observableArrayList());

    for(int i = 0; i < ruleParts.size(); i++) {
        this.ruleParts.add(new SimpleStringProperty(ruleParts.get(i)));
    }
}

public SimpleListProperty<SimpleStringProperty> getRulePartsProperty() {
    return this.ruleParts;
}

public List<SimpleStringProperty> getRulePartsProperties() {
    return (List<SimpleStringProperty>)this.ruleParts;
}

public List<String> getRuleParts() {
    List<String> parts = new ArrayList<String>();
    for(int i = 0; i < this.ruleParts.size(); i++) {
        parts.add(this.ruleParts.get(i).get());
    }

    return parts;
}

public SimpleBooleanProperty getIsActiveProperty() {
    return this.isActive;
}

public boolean isActive() {
    return isActive.get();
}

public void setActive(boolean isActive) {
    this.isActive.set(isActive);
}
}

提前致谢

0 个答案:

没有答案