我正在开发一个复杂的应用程序,需要从窗格中删除一行,然后更新其余行的位置。为了便于说明,删除前的应用程序如下所示:
问题在于 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);
}
看起来剩余行的更新发生在重新绘制窗格之前。然而,代码以串行方式执行:首先删除线路,然后删除端口,最后触发线路更新。
备注:线条通过鼠标事件绑定到端口,每次节点移动都会纠正错误的位置。但是,删除一行后,图表就会立即损坏。
您可以尝试以下方法。我不知道它是否有效,因为您没有发布 MCVE 进行测试。
PauseTransition pause = new PauseTransition(Duration.millis(index * 100));
pause.setOnFinished(
e -> {
FXPortLayout p = ((FxAbstractPort) port).getLayout();
inputPorts.remove(p);
vBoxInputPorts.getChildren().remove(p);
updateLines();
}
);
pause.play();