CheckBoxTreeItems 始终独立,未正确呈现。为什么?
CheckBoxTreeItems always independent, not rendered properly. Why?
我是 JavaFX 的新手,我正在尝试创建一个简单的 TreeTableView,其中包含
单个布尔列并使用 CheckBoxTreeTableCell 呈现。
我遇到的问题是两个 CheckBoxTreeItem 似乎是独立的(selecting
根不 select child 反之亦然)。我什至尝试设置
手动独立(参见注释代码)但没有区别。
CheckBoxTreeItems 的文档说 "By default, CheckBoxTreeItem instances are dependent",这似乎对我不起作用。
此外,我希望模型 class 的 toString() 值显示为复选框'
文本但没有绘制文本,只有空复选框。这是为什么?
最后,可以为 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 + "]";
}
}
}
一个CheckBoxTreeItem
提供一个selected
property。正是这个 属性 尊重 CheckBoxTreeItem
的 independent
状态(即,如果选择父 CheckBoxTreeItem
,则自动选择此 CheckBoxTreeItem
,等等) .
但是,在您的应用程序中,CheckBoxTreeItem
的 selected
属性 不是项目所代表的 属性,因为您将单元格值工厂设置为映射到项目所代表的 Model
实例的 selected
属性。因此,选中复选框将 Model.selected
设置为 true
,但当然没有逻辑管理 属性 就父 and/or 子选择的属性而言。
通常当您有自己的表示复选框状态的布尔值 属性 时,您不会使用 CheckBoxTreeItem
。但是,如果您想要非独立属性的功能,则必须自己实现。因为这个逻辑其实很复杂,如果你想要自己的Model
class,我会把感兴趣的属性双向绑定到CheckBoxTreeItem
的selectedProperty
]:
Model rootModel = new Model("Root");
final CheckBoxTreeItem<Model> root = new CheckBoxTreeItem<>(rootModel);
root.selectedProperty().bindBidirectional(rootModel.selectedProperty());
Model parentModel = new Model("Parent");
final CheckBoxTreeItem<Model> parent = new CheckBoxTreeItem<>( parentModel);
parent.selectedProperty().bindBidirectional(parentModel.selectedProperty());
Model childModel = new Model("Child");
final CheckBoxTreeItem<Model> child = new CheckBoxTreeItem<>(childModel);
child.selectedProperty().bindBidirectional(childModel.selectedProperty());
我是 JavaFX 的新手,我正在尝试创建一个简单的 TreeTableView,其中包含 单个布尔列并使用 CheckBoxTreeTableCell 呈现。
我遇到的问题是两个 CheckBoxTreeItem 似乎是独立的(selecting 根不 select child 反之亦然)。我什至尝试设置 手动独立(参见注释代码)但没有区别。
CheckBoxTreeItems 的文档说 "By default, CheckBoxTreeItem instances are dependent",这似乎对我不起作用。
此外,我希望模型 class 的 toString() 值显示为复选框' 文本但没有绘制文本,只有空复选框。这是为什么?
最后,可以为 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 + "]";
}
}
}
一个CheckBoxTreeItem
提供一个selected
property。正是这个 属性 尊重 CheckBoxTreeItem
的 independent
状态(即,如果选择父 CheckBoxTreeItem
,则自动选择此 CheckBoxTreeItem
,等等) .
但是,在您的应用程序中,CheckBoxTreeItem
的 selected
属性 不是项目所代表的 属性,因为您将单元格值工厂设置为映射到项目所代表的 Model
实例的 selected
属性。因此,选中复选框将 Model.selected
设置为 true
,但当然没有逻辑管理 属性 就父 and/or 子选择的属性而言。
通常当您有自己的表示复选框状态的布尔值 属性 时,您不会使用 CheckBoxTreeItem
。但是,如果您想要非独立属性的功能,则必须自己实现。因为这个逻辑其实很复杂,如果你想要自己的Model
class,我会把感兴趣的属性双向绑定到CheckBoxTreeItem
的selectedProperty
]:
Model rootModel = new Model("Root");
final CheckBoxTreeItem<Model> root = new CheckBoxTreeItem<>(rootModel);
root.selectedProperty().bindBidirectional(rootModel.selectedProperty());
Model parentModel = new Model("Parent");
final CheckBoxTreeItem<Model> parent = new CheckBoxTreeItem<>( parentModel);
parent.selectedProperty().bindBidirectional(parentModel.selectedProperty());
Model childModel = new Model("Child");
final CheckBoxTreeItem<Model> child = new CheckBoxTreeItem<>(childModel);
child.selectedProperty().bindBidirectional(childModel.selectedProperty());