JavaFX – удалить узел из панели – странное поведениеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JavaFX – удалить узел из панели – странное поведение

Сообщение Anonymous »

Я работаю над сложным приложением, которое требует удаления строки с панели, а затем обновления положения остальных строк. Для иллюстрации приложение перед удалением выглядит так:
Изображение

Проблема заключается в поведении JavaFX. У меня есть рабочий фрагмент кода, который удаляет порт с подключенной линией и правильно обновляет позиции остальных линий. Код следующий:

Код: Выделить всё

inputPortsList.registerAfterRemoveConsumer(
(port, index) -> {
FXPortLayout p = ((FxAbstractPort) port).getLayout();
inputPorts.remove(p);
vBoxInputPorts.getChildren().remove(p);
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
}
Platform.runLater(() -> {
updateLines();
});
}
);
Этот код дает правильную диаграмму:
Изображение

На мой взгляд, код должен быть правильно написан так. Однако этот код не обновляет строки, которые не удалены.

Код: Выделить всё

inputPortsList.registerAfterRemoveConsumer(
(port, index) -> {
FXPortLayout p = ((FxAbstractPort) port).getLayout();
inputPorts.remove(p);
vBoxInputPorts.getChildren().remove(p);
updateLines();
}
);
Но этот код приводит к повреждению диаграммы:
Изображение

Событие, удаляющее строку, корректно выполняется перед вызовом vBoxInputPorts.getChildren().remove(p) и выглядит следующим образом:

Код: Выделить всё

if (lineToDel != null) {
Line l = lineToDel.getLine();
pane.getChildren().remove(l);
}
Похоже, что обновление остальных строк происходит до перерисовки панели. Однако код выполняется последовательным образом: сначала удаляется строка, затем удаляется порт и, наконец, запускается обновление строки.
Одно замечание: строки привязаны к портируется через события мыши, и каждое движение узла исправляет неправильные положения. Однако сразу после удаления строки диаграмма повреждается.
РЕДАКТИРОВАТЬ: Приложение не использует фоновые потоки. Я добавил метод Platform.isJavaFXThread() ко всем частям, отвечающим за обновление позиций строк. Он всегда возвращает true. Приложение не использует библиотеки, позволяющие создавать потоки.

Код: Выделить всё

inputPortsList.registerAfterRemoveConsumer(
(port, index) -> {
FXPortLayout p = ((FxAbstractPort) port).getLayout();
inputPorts.remove(p);
vBoxInputPorts.getChildren().remove(p);
System.out.println(
Platform.isFxApplicationThread()
); // prints true
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
}
Platform.runLater(() -> {
System.out.println(
Platform.isFxApplicationThread()
); // prints true
updateLines();
});
}
);
Совместное использование рабочего приложения проблематично, поскольку оно использует библиотеки (для ленточного меню, структуры диаграммы, выполняющей диаграмму, и т. д. on) в локальном репозитории Maven.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -behaviour
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»