
Проблема заключается в поведении 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
Мобильная версия