我有一个数据模型"规则" 规则由保存为List的1-x String部分和规则处于活动状态的布尔值组成。
要在我的UI中显示此信息,我想添加一个包含2列的TableView。 第1列应显示规则文本作为一个整体,但需要大量定制。在单元格中,我为每个规则部分添加一个文本字段,然后绑定到StrinProperty(这就是为什么我需要一个字符串属性列表。 2.列应显示一个复选框以激活或停用规则(这没有问题,工作正常)
在我的规则模型具有布尔值isActive标志之前,我使用了Listview,它将整个Rule模型类作为Object。我创建了自己的ListCell实现并覆盖了updateItem(Object item,boolean isEmpty)来自定义单元格如下所示:
我希望第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与规则模型的绑定:
我真的不知道如何绑定它所以在单元格中我可以使用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);
}
}
提前致谢