自定义组件扩展JavaFX 8 TreeTableView

时间:2014-05-15 12:59:19

标签: java javafx-2 javafx-8

我有一个MyTreeTableView类扩展TreeTableView

我已经通过在派生类中传递一个可观察列表来填充树视图的几个方法,这在原始的TreeTableView中是不可用的。除此之外,没有其他功能。

我可以使用这个类,它在Java编码时按预期工作

MyTreeTableView localtree = new MyTreeTableView(new TreeItem<>());
localtree.setItems(myobservedList);

如果我将此实例添加到场景中,一切都像标准的TreeTableView一样。要将此实例添加到场景中,我必须在Java端执行此操作。

我必须将我的类MyTreeTableView放入自定义FXML组件中,以便可以使用场景构建器轻松拖放它。

在冒险进入FXML的自定义组件方面之前,我尝试将localtreetable分配给标准的Java FX 8 TreeTableView,它在FXML中定义并且是现有场景的一部分。

我做了以下

localtreetable.getColumns().addAll(col1,col2);
        localtreetable.setShowRoot(false);
        localtreetable.setItems(myobservedList);
        JavaFX8TreeTableView.setRoot(localtreetable.getRoot());
        col1 = (TreeTableColumn<Object, String>) JavaFX8TreeTableView.getColumns().get(0);
        col2 = (TreeTableColumn<Object, String>) JavaFX8TreeTableView.getColumns().get(1);

//setCellValueFactory and CellFactories for col1 and col2 after this.

此处col1col2在FXML中定义,它们是JavaFX8TreeTableView的列,也在FXML中定义。

通过这个hack,JavaFX8TreeTableView显示在UI上,其中填充了数据 localtreetable对象。但是,UI未正确预期,并且树视图混乱。当我说乱搞时,树的顺序正确,但是&gt;放置在树项的第4个字母上,单击箭头不会展开或关闭树项,您必须在其他位置单击它以展开和关闭它。 enter image description here 我的第一个问题是如何将值从localtreetable转换为JavaFx8TreeTableView,以便我可以将值填充到已定义的TreeTableView

1 个答案:

答案 0 :(得分:0)

迁移到Java8时,JavaFX 2.2中存在错误,同时填充TreeItem,branchExpand和branchCollapse事件,一些空的TreeItem如何被添加。您可以通过明确写入来修复该错误 setGraphic(NULL); 的setText(NULL); 在updateItem函数

public void updateItem(String item,boolean empty){             super.updateItem(item,empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(getTreeItem().getGraphic());
                if (
                    !getTreeItem().isLeaf()&&getTreeItem().getParent()!= null
                ){
                    setContextMenu(addMenu);
                }
            }
        }

参考 http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/tree-view.htm#BABDEADA