我的问题:我在下面详述的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;
}
就我所知,我的类是一个相当标准的实现,如果您需要更多,请询问我。
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);
}