JavaFX - 从窗格中删除节点 - 奇怪的行为

问题描述 投票:0回答:1

我正在开发一个复杂的应用程序,需要从窗格中删除一行,然后更新其余行的位置。为了便于说明,删除前的应用程序如下所示: Application before delete

问题在于 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();
                });
            }
    );

此代码生成正确的图表: enter image description here

在我看来,代码应该这样正确编写。但是,此代码不会更新未删除的行。

inputPortsList.registerAfterRemoveConsumer(
            (port, index) -> {
                FXPortLayout p = ((FxAbstractPort) port).getLayout();
                inputPorts.remove(p);
                vBoxInputPorts.getChildren().remove(p);           
                updateLines();
            }
    );

但是此代码会导致图表损坏: enter image description here

在调用 vBoxInputPorts.getChildren().remove(p) 之前正确执行删除行的事件,如下所示:

if (lineToDel != null) {                 
     Line l = lineToDel.getLine();
     pane.getChildren().remove(l);
}

看起来剩余行的更新发生在重新绘制窗格之前。然而,代码以串行方式执行:首先删除线路,然后删除端口,最后触发线路更新。

备注:线条通过鼠标事件绑定到端口,每次节点移动都会纠正错误的位置。但是,删除一行后,图表就会立即损坏。

java user-interface javafx events children
1个回答
0
投票

您可以尝试以下方法。我不知道它是否有效,因为您没有发布 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();
© www.soinside.com 2019 - 2024. All rights reserved.