JavaFX:使用单选按钮创建树视图

时间:2014-05-12 16:49:59

标签: treeview javafx radiobuttonlist

用例:我正在尝试提供一种功能,用户将元素组合/组合成最终解决方案。元素会有版本。为此,我需要CheckBoxes的组合来定义要包含的元素,然后单击Radio Buttons(嵌套在每个复选框下)以定义应该为所选元素使用的版本。

我目前正在使用来自ControlsFX的CheckTreeView控件。但我无法找到一种方法将RadioButtonMenuItems作为CheckBoxTreeItem的子项放在树中。有没有办法将CheckBoxTreeItem更改为RadioButton?

我目前的解决方案是我正在为所有树节点使用CheckBoxItems,但那些用于定义版本的节点就像单选按钮 - 选择一个将取消选择其余节点。

有关如何处理此事的任何想法?

编辑:在此处发布了新问题+代码here

1 个答案:

答案 0 :(得分:1)

对于初学者,您需要创建自己的自定义TreeCellFactory,根据需要显示复选框或单选按钮。类似的东西:

public class TreeCellFactory implements Callback<TreeView<Object>,TreeCell<Object>>
{
    @Override
    public TreeCell call( TreeView param )
    {
        return new TreeCell<Object>()
        {
            private final CheckBox  check = new CheckBox();
            private final RadioButton  radio = new RadioButton();
            private Property<Boolean>  prevRadioProp;
            {
                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 = ....;

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