首页 > 解决方案 > JavaFX 绑定布局属性不适用于动态添加的节点

问题描述

在我的程序中,在服务中,我创建了一个秒表(标签),用于计算从数据库加载数据的时间。

现在,我想将标签固定到适当的表上,所以我尝试使用该bind方法,但它不起作用。

请注意,我在 FXML 文件中创建了测试标签,它确实有效。

public class PutDataService extends Service {
    CanvasTableView tableView;
    Label labelTimer;
    Timer timer;

    public PutDataService(CanvasTableView canvasTableView) {
        this.tableView = canvasTableView;
        labelTimer = new Label("Time: ");
        timer = new Timer();

        Label testLabel = (Label) Controller.getInstance().getTarget().getAnchorPane().lookup("#testLabel");
        testLabel.setManaged(false);
        testLabel.layoutXProperty().bind(tableView.layoutXProperty());
        testLabel.layoutYProperty().bind(tableView.layoutYProperty().subtract(20.0));
        testLabel.toFront();


        Platform.runLater(() -> {
            Controller.getInstance().getTarget().getAnchorPane().getChildren().add(labelTimer);
            labelTimer.setManaged(false);
            labelTimer.layoutXProperty().bind(tableView.layoutXProperty());
            labelTimer.layoutYProperty().bind(tableView.layoutYProperty().subtract(20.0));
            labelTimer.toFront();
        });

        labelTimer.layoutXProperty().addListener((observableValue, number, t1) -> System.out.println(labelTimer.layoutXProperty().getValue()));//changed !

        setOnSucceeded((EventHandler<WorkerStateEvent>) workerStateEvent -> {
            //Unbind here
            Controller.getInstance().getTarget().getAnchorPane().getChildren().remove(labelTimer);
            timer.cancel();
            timer.purge();
        });
    }


    @Override
    protected Task createTask() {
        return new Task() {
            @Override
            protected Object call() throws Exception {
                //Start the stop watch , counts every 1 sec
                timer.schedule(new TimerTask() {
                    int i = 0;

                    @Override
                    public void run() {
                        Platform.runLater(() -> labelTimer.textProperty().setValue(getTimeMessage(i)));
                        i++;
                    }
                }, 0, 1000);

                tableView.putData();

                return null;
            }
        };
    }

}

我做错了什么?

标签: javafxservice

解决方案


推荐阅读