当前位置: 首页 > 知识库问答 >
问题:

VBox.getHeight()直到.setOnAction完成后才更改[重复]

丌官开宇
2023-03-14

因此,我不确定如何在.setOnAction事件期间计算节点的高度,我已尝试.requestLayout()/.applyCss()不确定还要尝试什么我正在尝试在添加节点后查找vBox的高度,但它只是在添加新节点之前打印节点的高度

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        VBox vBoxContainer = new VBox();
        vBoxContainer.setAlignment(Pos.CENTER);
        vBoxContainer.setPrefSize(200,200);

        VBox vBox = new VBox();
        vBox.setAlignment(Pos.CENTER);
        for (int i = 0; i < 5; i++)
            vBox.getChildren().add(new Label("newLabel"));
        vBoxContainer.getChildren().add(vBox);

        Button button = new Button("Add Label");
        button.setOnAction(event -> {
            System.out.println("Height Before new Label:"+vBox.getHeight());
            vBox.getChildren().add(new Label("newLabel"));
            //here is where I was adding code to produce expected result
            System.out.println("Height After new Label:"+vBox.getHeight());
        });

        Button checkButton = new Button("Print VBox Height");
        checkButton.setOnAction(event -> System.out.println("VBox Height:"+vBox.getHeight()));

        vBoxContainer.getChildren().addAll(button, checkButton);

        stage.setScene(new Scene(vBoxContainer));
        stage.show();
    }
}

运行该示例,然后单击将标签添加到vBox并输出的按钮

实际结果:

Height Before new Label:85.0
Height After new Label:85.0

预期结果:

Height Before new Label:85.0
Height After new Label:102.0    

但是如果你点击打印VBox高度按钮,它会显示正确的高度:

VBox Height:102.0

共有2个答案

尹凌龙
2023-03-14

requestLayout实际上并不执行布局传递。它只是告诉JavaFX,需要一个布局传递,这将导致JavaFX在方法返回后的一段时间内执行布局传递。要自己进行布局,您需要自己调用layout,即更改事件处理程序中的逻辑,如下所示:

button.setOnAction(event -> {
    System.out.println("Height Before new Label:"+vBox.getHeight());
    vBox.getChildren().add(new Label("newLabel"));

    // manually doing layout on the root here
    vBoxContainer.applyCss();
    vBoxContainer.layout();

    System.out.println("Height After new Label:"+vBox.getHeight());
});

请注意,我为根执行布局传递,因为祖先布局也可以参与确定节点的实际大小...

严恩
2023-03-14

您可以尝试将侦听器添加到VBox的height属性中。

VBox vBoxContainer = new VBox();
vBoxContainer.setAlignment(Pos.CENTER);
vBoxContainer.setPrefSize(200, 200);

VBox vBox = new VBox();
vBox.setAlignment(Pos.CENTER);
vBoxContainer.getChildren().add(vBox);
vBox.heightProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("Height changed to: " + newValue.doubleValue());
    if(newValue.doubleValue() > 100)
    {
        //do something!
    }
});
for (int i = 0; i < 5; i++) {
    vBox.getChildren().add(new Label("newLabel"));
}
Button button = new Button("Add Label");
button.setOnAction(event -> {
    vBox.getChildren().add(new Label("newLabel"));
});
Button checkButton = new Button("Print VBox Height");
checkButton.setOnAction(event -> System.out.println("VBox Height:" + vBox.getHeight()));

vBoxContainer.getChildren().addAll(button, checkButton);
stage.setScene(new Scene(vBoxContainer));
stage.show();
 类似资料:
  • 我一直想用python制作一个排序算法可视化工具,并决定使用Tkinter库作为我可视化数据的方式(如果有人有更好的库可以使用,我愿意接受建议,我查看了matplotlib,但不愿意使用)。我的问题是,在对数组排序时,我想进行交换,在交换后显示更新的数组,然后继续排序;但最终发生的是数组排序,然后更新整个排序的数组。 我也试过这个应用程序。在(300,self.redrawCanvas)之后,并得

  • 问题内容: 我显示了在Ajax调用之前和Ajax调用之后加载DOM的过程,我将其隐藏。由于某些原因,加载图像仅在ajax调用完成之后出现。结果是,除非我输入以下内容,否则加载图像甚至都不会出现。代码如下: 我已经在我的网站上的其他Ajax调用上进行了测试,并且发生了相同的问题。有人解决过这个吗?我正在使用Chrome 26。 编辑:我忘记指定我正在使用 同步 ajax调用。() 问题答案: 这取决

  • 我用woocommerce做了一个简单的网店,有三种付款方式。理想情况下,可通过直接银行转账和开户。订单ID是根据付款方式创建的。例如,如果使用iDEAL付款,订单id将变为ID190100;如果以账户付款,订单id将变为RK190100。我从BeRocket的插件“WooCommerce的顺序订单号”中得到了这一点,但这些都是在付款完成之前创建的。订单ID必须在付款后才能最终确定。现在,尚未付款

  • 问题内容: 我有一个jenkins作业,它从github克隆存储库,然后运行powershell脚本来增加文件中的版本号。我现在正尝试将该更新文件发布回github上的原始存储库,因此当开发人员提取更改时,他会获得最新的版本号。 我尝试在构建后事件中使用Git Publisher,并且可以毫无问题地发布标签,但是它似乎没有发布任何文件。 问题答案: 我自己找到了答案,该博客对您有所帮助:http

  • 我有一个像下面这样的Python脚本: 我以以下方式执行: 然后我检查是否有任何初始输出,但没有: 我至少希望在几秒钟后看到“开始”。即使等了几分钟,然后杀了它,我也没有输出。如果可能,我该如何解决这个问题?

  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。