Использование Platform.runLater для отключения свертывания аккордеона в JavaFX

Я хочу использовать решение, предложенное в ответе по адресу: Предотвратить аккордеон в JavaFX от коллапс, чтобы предотвратить полный коллапс Accordion в JavaFX.

Мой вопрос: почему прослушиватель, добавленный в ExpandPaneProperty, использует Platform.runLater для вызова setCollapsible(false)?

Действительно, если я удалю Platform.runLater, после сворачивания/расширения панелей их содержимое почему-то исчезает. Так почему же runLater решает эту проблему?


person user1859872    schedule 28.11.2012    source источник
comment
stackoverflow.com/users/1155209/jewelsea Не могли бы вы помочь ответить на этот вопрос?   -  person user1859872    schedule 06.12.2012


Ответы (1)


В документации ChangeListener‹ T> указано, что:

В целом изменение наблюдаемого значения в этом методе считается плохой практикой.

Где этот метод относится к:

void changed(ObservableValue<? extends T> observable, T oldValue, T newValue);

RunLater гарантирует, что панель будет изменена при следующем запуске потока приложения JavaFX и, таким образом, вносит изменения, когда это безопасно.

person drzymala    schedule 13.01.2013
comment
То, что вы говорите, применимо здесь, если внутри ChangeListener мы изменяем значение ExpandedPaneProperty, что не так. Здесь мы просто устанавливаем для свойства collapsibleProperty то же значение, что и для свойства expandPaneProperty. - person user1859872; 28.01.2013
comment
При изменении любого из свойств expandPane вы делаете его недействительным. - person drzymala; 29.01.2013
comment
Это не правда. Я думаю, вы путаете «изменение значения» с «изменением того же экземпляра значения». Если вы измените свойство ExpandedPane, вы не измените его «значение», и, следовательно, Change/InvalidationListeners, добавленные в ExpandPane, не будут уведомлены. - person user1859872; 29.01.2013
comment
Я полностью понимаю, что вы имеете в виду, но я не согласен с тем, что относится к предложению, упомянутому в javadoc. Почему это плохая практика? Ваше рассуждение Что-то, что могло бы привести к ошибке памяти, не было бы названо плохой практикой, верно, за исключением того, что изменение expandPaneProperty внутри его собственного changeListener не обязательно должно вызывать бесконечный цикл. Вы можете иметь чеки, например. что-то вроде только если (newValue == null) внести изменения. Однако javadoc, вероятно, предупреждает об этом, потому что вы можете вызвать бесконечный цикл, если не будете осторожны со своими проверками. - person user1859872; 30.01.2013
comment
@ user1859872 Я думаю, то, что вы сказали о свойствах наблюдаемого значения, верно. Я зарегистрировал ошибку по этому вопросу на javafx-jira #RT-28140 Тем не менее я думаю, что когда javadoc называет что-то плохой практикой, происходит нечто большее. Я также подал запрос на функцию, чтобы аккордеон не складывался #RT-28141 - person drzymala; 05.02.2013