Как определить высоту TitledPane после раскрытия панели

После раскрытия панели TitledPane метод getHeight() возвращает высоту закрытой панели. Метод isExpanded() возвращает true/ После закрытия - наоборот: высоту раскрытой. То есть возвращается старое значение. Метод getHeight() применяю в обработке "On Mouse Released", когда мышкой раскрываешь панель.


Ответы (1 шт):

Автор решения: insolor

Когда срабатывает событие мыши, анимация сворачивания/разворачивания только начинается. В этот момент свойство isExpanded уже изменило значение, но высота еще старая.

Можно либо отключить анимацию, и добавить listener к свойству heightProperty() (если не отключить анимацию, то будут фиксироваться все промежуточные значения высоты между свернутым и развернутым состоянием):

titledPane.setAnimated(false);
titledPane.heightProperty().addListener(((observable, oldValue, newValue) -> 
    System.out.printf("%s %f\n",
            titledPane.isExpanded() ? "Expanded" : "Collapsed",
            titledPane.getHeight())));

Пример вывода:

Expanded 157,000000
Collapsed 26,000000

Также можно проверять высоту через небольшой промежуток времени (чтобы анимация успела завершиться):

titledPane.setAnimated(true);
titledPane.expandedProperty().addListener((observable, oldValue, newValue) ->
        CompletableFuture.runAsync(() -> System.out.printf("%s %f\n",
                titledPane.isExpanded() ? "Expanded" : "Collapsed", titledPane.getHeight()),
                CompletableFuture.delayedExecutor(500L, TimeUnit.MILLISECONDS)));

Вывод:

Collapsed 26,000000
Expanded 157,000000

Задержка через Thread.sleep в основном потоке не поможет, т.к. анимация (и вообще графический интерфейс) работает в этом же потоке, из-за этого графический интерфейс подвиснет на время задержки (в итоге анимация остановится и продолжится только после окончания задержки, а не будет выполняться во время нее). Но можно использовать Thread.sleep внутри отдельного потока, например внутри runnable, переданного в CompletableFuture.runAsync в примере выше (как альтернатива delayedExecutor):

titledPane.setAnimated(true);
titledPane.expandedProperty().addListener((observable, oldValue, newValue) ->
        CompletableFuture.runAsync(() -> {
            Thread.sleep(500);
            System.out.printf("%s %f\n",
                titledPane.isExpanded() ? "Expanded" : "Collapsed", titledPane.getHeight())
        });
→ Ссылка