【问题标题】:JavaFX TreeView expand/collapse disclosure arrow bugJavaFX TreeView 展开/折叠披露箭头错误
【发布时间】:2018-04-24 21:58:28
【问题描述】:

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

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

似乎在 OpenJDK 错误报告中发现了此问题。

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

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

我使用的是默认样式表(Modena),它定义了显示节点旋转箭头,如下所示:

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

据我所知,我的课程是一个非常标准的实现,如果您需要更多,请咨询我。


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);
}

【问题讨论】:

    标签: java javafx treeview


    【解决方案1】:

    我通过在样式表中添加一个明确的箭头旋转回 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 样式表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2013-12-18
      • 2013-09-20
      • 2012-04-24
      • 2017-02-21
      相关资源
      最近更新 更多