我是JavaFX的新手,我正在尝试创建一个简单的TreeTableView,其中包含一个 单个布尔列,使用CheckBoxTreeTableCell进行渲染。
我遇到的问题是两个CheckBoxTreeItems看起来是独立的(选择 根没有选择孩子,反之亦然。我甚至尝试设置 手动独立(参见注释代码),但没有区别。
CheckBoxTreeItems的文档说"默认情况下,CheckBoxTreeItem实例依赖",这对我来说似乎不起作用。
另外,我希望将Model类的String()值显示为复选框' 文本但没有绘制文本,只有空复选框。这是为什么?
最后,可以为CheckBoxTreeItem设置一个图形节点 然后,节点显示在CheckBoxTreeItem的左侧。是否有可能 它是在复选框和复选框文本之间绘制的吗?类似的东西:
[x] [graphic_node]一个简单的复选框文本
我正在使用JDK 1.8.0_40
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.Scene;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.CheckBoxTreeTableCell;
import javafx.stage.Stage;
public final class CheckBoxTreeItemTest extends Application {
private Stage stage;
public static void main(String[] args) {
launch(args);
}
@Override
public final void start(final Stage stage) throws Exception {
this.stage = stage;
final CheckBoxTreeItem<Model> root = new CheckBoxTreeItem<>(new Model("Root"));
final CheckBoxTreeItem<Model> parent = new CheckBoxTreeItem<>(new Model("Parent"));
final CheckBoxTreeItem<Model> child = new CheckBoxTreeItem<>(new Model("Child"));
//Manually setting independence makes no difference
/*parent.setIndependent(false);
child.setIndependent(false);
root.setIndependent(false);*/
parent.getChildren().add(child);
root.getChildren().add(parent);
final TreeTableColumn<Model, Boolean> selectedColumn =
new TreeTableColumn<>("Selection");
selectedColumn.setEditable(true);
selectedColumn.setCellValueFactory(param -> param.getValue().getValue().selectedProperty());
selectedColumn.setCellFactory(CheckBoxTreeTableCell.<Model>forTreeTableColumn(selectedColumn));
final TreeTableView<Model> table = new TreeTableView<>(root);
table.setShowRoot(false);
table.setEditable(true);
table.getColumns().add(selectedColumn);
final Scene scene = new Scene(table, 500, 350);
stage.setScene(scene);
stage.show();
}
private class Model {
private final BooleanProperty selected;
private final StringProperty name;
public Model(final String name) {
this.selected = new SimpleBooleanProperty(false);
this.name = new SimpleStringProperty(name);
}
public final void setSelected(final boolean selected) {
this.selected.set(selected);
}
public final boolean isSelected() {
return selected.get();
}
public final BooleanProperty selectedProperty() {
return selected;
}
public final StringProperty nameProperty() {
return name;
}
@Override
public String toString() {
return "Model [selected=" + selected + ", name=" + name + "]";
}
}
}
答案 0 :(得分:0)
CheckBoxTreeItem
提供selected
property。这个属性尊重independent
的{{1}}状态(即如果选择了父CheckBoxTreeItem
,则自动选择此CheckBoxTreeItem
等)。
但是,在您的应用程序中,CheckBoxTreeItem
的{{1}}属性不是该项所表示的属性,因为您将单元格值工厂设置为映射到CheckBoxTreeItem
属性项目所代表的selected
实例。因此,选中复选框会将selected
设置为Model
,但当然没有根据父级和/或子级选定属性管理该属性的逻辑。
通常,如果您有自己的布尔属性来表示复选框的状态,则不会使用Model.selected
。但是,如果您需要非独立属性的功能,则必须自己实现。由于该逻辑实际上非常复杂,如果您想要自己的true
类,我只需将感兴趣的属性双向绑定到CheckBoxTreeItem
的{{1}}:
Model