我在BorderPane(中央)中有一个 JavaFX VBox 。VBox 的内容是使用一些业务逻辑计算的,它取决于vbox可见部分的高度。
所以基本上我需要一个监听器来观察 vbox 的可见高度的变化 = 边框窗格中央部分的高度。
以下代码演示了我尝试过的内容:
public class HelloFX extends Application {
@Override
public void start(Stage primaryStage) {
VBox vbox = new VBox();
vbox.boundsInParentProperty()
.addListener((obs, oldValue, newValue) ->
System.out.println(newValue.getHeight()));
Button button = new Button("ADD LINE");
button.setPrefHeight(25);
button.setOnAction(event ->
vbox.getChildren().add(new Label("line")));
BorderPane borderPane = new BorderPane();
borderPane.setCenter(vbox);
borderPane.setTop(button);
Scene scene = new Scene(borderPane, 100, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
BorderPane 在顶部位置带有简单的按钮,在中央位置带有 VBox。单击按钮会向 vBox 添加一行。总场景高度为 100,按钮高度为 25,其余 (75) 为 vBox。
我正在寻找一些听众来报告边框窗格中央部分高度的变化。因此,在我的示例中,无论我在 vBox 中添加了多少行,它都应该始终打印“75”。改变值的唯一事件应该是调整整个窗口的大小。实际上,一旦 vBox 被填满,我的听众报告高度值增加。显然 height 属性包括 vbox 的不可见部分。
编辑
最后我找到了一些解决方案 - 将 vBox 放置在ScrollPane中并禁用滚动条。然后我可以简单地听一下滚动窗格的高度属性,一切都按预期工作。
public class HelloFX extends Application {
@Override
public void start(Stage primaryStage) {
VBox vbox = new VBox();
ScrollPane scrollPane = new ScrollPane();
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setContent(vbox);
scrollPane.heightProperty()
.addListener((obs, oldValue, newValue) ->
System.out.println(newValue));
Button button = new Button("ADD LINE");
button.setPrefHeight(25);
button.setOnAction(event ->
vbox.getChildren().add(new Label("line")));
BorderPane borderPane = new BorderPane();
borderPane.setCenter(scrollPane);
borderPane.setTop(button);
Scene scene = new Scene(borderPane, 100, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}