我发现了一个异常,我想知道这可能是ScrollPane的JavaFX错误,还是我的构图有问题。
根节点是BorderPane。左侧的内容是使用VBox的侧边栏。此侧边栏没有滚动窗格。中心内容是ScrollPane。
BorderPane root = new BorderPane();
MenuBar top = new MenuBar();
root.setTop(top);
VBox left = new VBox();
root.setLeft(left);
ScrollPane center = new ScrollPane();
root.setCenter(center);
将窗口调整为小于左侧内容的高度时,滚动条的下限不可见。
这是一个小型测试应用程序,我必须使用以下方法重现它:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ScrollPaneApplication extends Application {
public static void main(String[] args) {
ScrollPaneApplication.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();
root.setPadding(new Insets(10, 10, 10, 10));
final Menu menu1 = new Menu("File");
final Menu menu2 = new Menu("Options");
final Menu menu3 = new Menu("Help");
final MenuBar menuBar = new MenuBar();
menuBar.getMenus().addAll(menu1, menu2, menu3);
root.setTop(menuBar);
VBox leftBox = new VBox();
addLabel(leftBox);
leftBox.setSpacing(10);
root.setLeft(leftBox);
VBox box1 = new VBox();
box1.setSpacing(10);
addLabel(box1);
VBox box2 = new VBox();
box2.setSpacing(10);
addLabel(box2);
VBox box3 = new VBox();
box3.setSpacing(10);
addLabel(box3);
VBox box4 = new VBox();
box4.setSpacing(10);
addLabel(box4);
VBox box5 = new VBox();
box5.setSpacing(10);
addLabel(box5);
HBox box = new HBox();
box.setSpacing(10);
box.getChildren().addAll(box1, box2, box3, box4, box5);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(box);
root.setCenter(scrollPane);
Scene scene = new Scene(root, 1024, 1024);
primaryStage.setScene(scene);
primaryStage.show();
}
private void addLabel(VBox parentBox) {
TitledPane pane1 = new TitledPane();
pane1.setPadding(new Insets(10, 10, 10, 10));
pane1.setText("Loop 1");
VBox box1 = new VBox();
for (int i = 0; i < 10; i++) {
box1.getChildren().add(new Label("Label " + i));
}
pane1.setContent(box1);
TitledPane pane2 = new TitledPane();
pane2.setPadding(new Insets(10, 10, 10, 10));
pane2.setText("Loop 2");
VBox box2 = new VBox();
for (int j = 0; j < 10; j++) {
box2.getChildren().add(new Label("Label " + j));
}
pane2.setContent(box2);
TitledPane pane3 = new TitledPane();
pane3.setPadding(new Insets(10, 10, 10, 10));
pane3.setText("Loop 3");
VBox box3 = new VBox();
for (int k = 0; k < 10; k++) {
box3.getChildren().add(new Label("Label " + k));
}
pane3.setContent(box3);
parentBox.getChildren().addAll(pane1, pane2, pane3);
}
}
答案 0 :(得分:0)
TLDR:您只需要告诉javafx它可以调整左框的大小,simpy add
leftBox.setMinHeight(0);
到您的来源;
这里的意思是您有这个左侧的VBox,并且它的高度现在已经固定,因为您没有指定最小,最大和首选高度。当您尝试调整窗口大小时,VBox的高度保持固定。而且,如果您查看BorderPane布局
您将看到,与左同一行(位于VBox的左侧)的中心区域(您具有滚动窗格的位置),因此中心最小高度受左侧高度限制。 当调整窗口大小时,中心高度不会改变,因此滚动窗格的高度也不会改变,它认为仍然没有滚动内容。当它从视口掉出来时
要更改此设置,您需要告诉javaFX,它可以将左VBox的高度调整为所需的值。默认情况下,它将在Windows调整大小时发生。
leftBox.setMinHeight(0);
说,如果需要,它可以将leftBox的大小调整为零。