JavaFX TreeView раскрыть / свернуть раскрытие стрелка ошибка - PullRequest
0 голосов
/ 25 апреля 2018

Мой вопрос: есть ли обходной путь / исправление для ошибки, которую я подробно описал ниже, или это проблема в моем коде?

Как видно из рисунка ниже, нажатие на один узел раскрытия (развернуть / свернуть) случайным образом влияет на стиль другой стрелки раскрытия; иногда стрелка не поворачивается обратно при развале, кажется, что нет шаблона, это может казалось бы, влияет на любой другой.

Похоже, эта проблема была обнаружена в отчете об ошибке 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;
}

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 голосов
/ 31 мая 2018

Я решил свою проблему, добавив в свою таблицу стилей явное вращение назад к 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;
}

Эти селекторы стилей взяты из таблицы стилей Modena по умолчанию Java 2018-03-20

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...