Мой вопрос: есть ли обходной путь / исправление для ошибки, которую я подробно описал ниже, или это проблема в моем коде?
Как видно из рисунка ниже, нажатие на один узел раскрытия (развернуть / свернуть) случайным образом влияет на стиль другой стрелки раскрытия; иногда стрелка не поворачивается обратно при развале, кажется, что нет шаблона, это может казалось бы, влияет на любой другой.
Похоже, эта проблема была обнаружена в отчете об ошибке OpenJDK .
Но я использую 64-битную версию JDK 10 (18.03.20) для Windows, это никогда не исправлялось в стандартной JDK?
Из моего тестирования кажется, что TreeItem
имеют правильные значения для 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);
}