JavaFX:单选按钮+ CheckBox TreeView

时间:2014-10-21 14:07:10

标签: treeview radio-button javafx-8

在参考我之前的问题here时,我做了以下代码。

我正在尝试制作一个树视图,其中显示了叶子的单选按钮,以及非叶子项的复选框。下面的代码没有显示任何内容。我确信我在某个地方(或任何地方)做了一些极其错误的事情。任何帮助深表感谢。 感谢

public class RadioCheckBoxTreeView extends TreeView {

public RadioCheckBoxTreeView() {

    setCellFactory(new Callback<TreeView<Object>, TreeCell<Object>>() {

        @Override
        public TreeCell<Object> call(TreeView<Object> param) {
            return new RadioCheckBoxCellImpl();
        }
    });
}

private static class RadioCheckBoxCellImpl extends TreeCell<Object> {

    private final CheckBox check = new CheckBox();
    private final RadioButton radio = new RadioButton();
    private Property<Boolean> prevRadioProp;

    public RadioCheckBoxCellImpl() {
    }

    {
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

    @Override
    public void updateItem(Object item, boolean empty) {
        if (prevRadioProp != null) {
            radio.selectedProperty().unbindBidirectional(prevRadioProp);
            prevRadioProp = null;
        }
        check.selectedProperty().unbind();

        if (!empty && item != null) {
            Property<Boolean> selectedProp = prevRadioProp;

            if (getTreeItem().isLeaf()) // display radio button
            {
                radio.setText("radio");
                radio.selectedProperty().bindBidirectional(selectedProp);
                prevRadioProp = selectedProp;
                setGraphic(radio);
            } else // display checkbox
            {
                check.setText("check");
                check.selectedProperty().bind(selectedProp);
                setGraphic(check);
            }
        } else {
            setGraphic(null);
            setText(null);
        }
    }

   }

这是我的start方法的样子

public void start(Stage primaryStage) {


    AnchorPane pane = new AnchorPane();
    Scene scene = new Scene(pane);

    MyTreeView tv = new MyTreeView();
    tv.setRoot(new TreeItem());

    TreeItem child1 = new TreeItem();
    child1.setValue("1");

    TreeItem child2 = new TreeItem();
    child2.setValue("2");
    TreeItem child3 = new TreeItem();
    child3.setValue("3");

    tv.getRoot().getChildren().add(child1);
    tv.getRoot().getChildren().add(child2);
    child2.getChildren().add(child3);

    pane.getChildren().add(tv);
    primaryStage.setScene(scene);
    primaryStage.show();
}

1 个答案:

答案 0 :(得分:0)

好的,我设法做到这一点。我还根据类型更改了图形。

        @Override
        public void updateItem(Object item, boolean empty) {
            if (prevRadioProp != null) {
                radio.selectedProperty().unbindBidirectional(prevRadioProp);
                prevRadioProp.setValue(true);
            }
            check.selectedProperty().unbind();
            if (!empty && item != null) {
                SimpleBooleanProperty selectedProp = prevRadioProp;
                if (item.getClass().getName().contains("Option")) // display radio button
                {
                    radio.setText("Option");
                    radio.selectedProperty().bindBidirectional(selectedProp);
                    prevRadioProp = selectedProp;
                    setGraphic(radio);
                } else // display checkbox
                {
                    check.setText("Feature");
                    check.selectedProperty().bind(selectedProp);
                    setGraphic(check);
                }
            } else {
                setGraphic(null);
                setText(null);
            }

            super.updateItem(item, empty);
        }

enter image description here

如何设置选择逻辑?基于代码,它给出了一个&#34; CheckBox.selected:无法设置绑定值。&#34;错误。