因此,我不确定如何在.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
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());
});
请注意,我为根执行布局传递,因为祖先布局也可以参与确定节点的实际大小...
您可以尝试将侦听器添加到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可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。