JavaFX TreeView展开/折叠公开箭头错误

时间:2018-04-24 21:58:29

标签: java javafx treeview

我的问题:我在下面详细介绍了错误的解决方法/解决方法,还是我的代码中存在问题?

正如你在下面的gif中看到的,点击一个披露(展开/折叠)节点随机影响另一个披露箭头的样式也有时箭头在折叠时不会旋转回来,似乎没有模式,它可能似乎影响到任何其他人。

看起来这个问题已在OpenJDK错误报告中找到。

但是我在Windows上使用JDK 10(18.03.20)64位,这是否从未在标准JDK中修复过?

从我的测试来看,TreeItem似乎isExpanded()具有正确的值,即使它们显示(造型)不正确。

我正在使用默认样式表(Modena),它定义了披露节点旋转箭头,如下所示:

.tree-cell:expanded > .tree-disclosure-node > .arrow,
.tree-table-row-cell:expanded > .tree-disclosure-node > .arrow {
    -fx-rotate: 90;
}

spooky action

据我所知,我的课程是一个非常标准的实施方案,如果您需要更多,请问我。

XSContent rootContent = //...
TreeView<XSContent> tree = new TreeView<>(rootContent);
public final class XSTreeItem extends TreeItem<XSContent> {

    private boolean isLeaf;
    private boolean isFirstTimeChildren = true;
    private boolean isFirstTimeLeaf = true;

    public XSTreeItem(XSContent element) {
        super(element);
    }

    @Override
    public ObservableList<TreeItem<XSContent>> getChildren() {
        if (isFirstTimeChildren) {
            isFirstTimeChildren = false;
            getChildren().setAll(getValue().buildChildren());
        }
        return super.getChildren();
    }

    @Override
    public boolean isLeaf() {
        if (isFirstTimeLeaf) {
            isFirstTimeLeaf = false;
            isLeaf = getValue().isLeaf();
        }
        return isLeaf;
    }
}
public final class XSTreeCell extends TreeCell<XSContent> {

    public XSTreeCell() {
        super();
    }

    @Override
    protected void updateItem(XSContent item, boolean empty) {
        super.updateItem(item, empty);
        if (item == null || empty) {
            setStyle("");
            setText(null);
            setGraphic(null);
        } else {
            item.configureCell(this);
        }
    }
}
public abstract class XSContent {

    public abstract boolean isLeaf(); // works as expected

    /** gets the children of this XSContent, works as expected */
    public abstract ObservableList<XSTreeItem> buildChildren();

    /** currently just setting the text of the cell */
    public abstract void configureCell(XSTreeCell cell);
}

1 个答案:

答案 0 :(得分:2)

我通过在样式表中添加一个明确的旋转箭头来解决我的问题:

.tree-cell > .tree-disclosure-node > .arrow,
.tree-table-row-cell > .tree-disclosure-node > .arrow {
    -fx-rotate: 0;
}

即使已在默认的Modena样式表中定义,也需要添加以下内容才能正常工作:

.tree-cell:expanded > .tree-disclosure-node > .arrow,
.tree-table-row-cell:expanded > .tree-disclosure-node > .arrow {
    -fx-rotate: 90;
}

这些样式选择器来自Java 2018-03-20的默认Modena样式表