Как определить высоту TitledPane после раскрытия панели
После раскрытия панели TitledPane метод getHeight() возвращает высоту закрытой панели. Метод isExpanded() возвращает true/ После закрытия - наоборот: высоту раскрытой. То есть возвращается старое значение. Метод getHeight() применяю в обработке "On Mouse Released", когда мышкой раскрываешь панель.
Ответы (1 шт):
Когда срабатывает событие мыши, анимация сворачивания/разворачивания только начинается. В этот момент свойство 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())
});