JavaFX Accordion установил следующую расширенную панель - PullRequest
1 голос
/ 29 июня 2019

В Accordion можно установить выбранную панель с помощью accordion.setExpandedPane, а также получить всех детей с помощью accordion.getPanes().

Однако я изо всех сил пытаюсь найти, как реализовать функциональность «выбрать следующую панель» без явного расширения класса TitledPane для панелей и поддержания индекса вручную с помощью accordion.expandedPaneProperty() и некоторой пользовательской реализации.

Предлагаемое решение - добавить прослушиваемое expandedPaneProperty():

    accordion.expandedPaneProperty().addListener((observable, oldValue, newValue) -> {
        if(null != newValue){
            idx = 0;
            for(TitledPane whytho: this.getPanes()){
                if(!whytho.equals(newValue))idx++;
                else break;
            }
            selectedIndex = idx;
        }
    });

Есть ли более простой способ для этого?

1 Ответ

2 голосов
/ 29 июня 2019

Вы можете запросить индекс расширенной в данный момент панели, используя List#indexOf(Object).Тогда вам просто нужно установить расширенную панель на панель на index ± 1.

private void expandPrevious(Accordion acc) {
    int index = acc.getPanes().indexOf(acc.getExpandedPane());
    int newIndex = Math.max(index - 1, 0);
    acc.setExpandedPane(acc.getPanes().get(newIndex));
}

private void expandNext(Accordion acc) {
    int index = acc.getPanes().indexOf(acc.getExpandedPane());
    int newIndex = Math.min(index + 1, acc.getPanes().size() - 1);
    acc.setExpandedPane(acc.getPanes().get(newIndex));
}

Вышеприведенное не выполняет никакого обхода логики;Другими словами, вызов expandNext пока последняя панель развернута, не расширит первую панель, скорее ничего не изменится.Он также не обрабатывает случай, когда getExpandedPane() возвращает null.

...