代码之家  ›  专栏  ›  技术社区  ›  xtratic Rob

JavaFX TreeView展开/折叠披露箭头错误

  •  2
  • xtratic Rob  · 技术社区  · 7 年前

    我的问题:我在下面详述的bug是否有解决方法/修复方法,或者它是我的代码中的一个问题?

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

    看起来此问题是在 OpenJDK 错误报告。

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

    从我的测试来看 TreeItem s具有正确的值 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 回复  |  直到 6 年前
        1
  •  3
  •   xtratic Rob    6 年前

    我通过在样式表中为箭头添加一个显式旋转回0来解决问题:

    .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样式表