CheckBoxTreeItem始终是独立的,未正确呈现。为什么?

时间:2015-03-07 18:52:33

标签: java javafx javafx-8

我是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 + "]";
    }
}

}

1 个答案:

答案 0 :(得分:0)

CheckBoxTreeItem提供selected property。这个属性尊重independent的{​​{1}}状态(即如果选择了父CheckBoxTreeItem,则自动选择此CheckBoxTreeItem等)。

但是,在您的应用程序中,CheckBoxTreeItem的{​​{1}}属性不是该项所表示的属性,因为您将单元格值工厂设置为映射到CheckBoxTreeItem属性项目所代表的selected实例。因此,选中复选框会将selected设置为Model,但当然没有根据父级和/或子级选定属性管理该属性的逻辑。

通常,如果您有自己的布尔属性来表示复选框的状态,则不会使用Model.selected。但是,如果您需要非独立属性的功能,则必须自己实现。由于该逻辑实际上非常复杂,如果您想要自己的true类,我只需将感兴趣的属性双向绑定到CheckBoxTreeItem的{​​{1}}:

Model