JavaFX ScrollPane:滚动条部分隐藏

时间:2018-10-16 15:58:36

标签: java javafx

我发现了一个异常,我想知道这可能是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);

将窗口调整为小于左侧内容的高度时,滚动条的下限不可见。

这些屏幕截图说明了“错误”: enter image description here enter image description here

这是一个小型测试应用程序,我必须使用以下方法重现它:

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);
    }
}

1 个答案:

答案 0 :(得分:0)

TLDR:您只需要告诉javafx它可以调整左框的大小,simpy add

leftBox.setMinHeight(0);

到您的来源;

这里的意思是您有这个左侧的VBox,并且它的高度现在已经固定,因为您没有指定最小,最大和首选高度。当您尝试调整窗口大小时,VBox的高度保持固定。而且,如果您查看BorderPane布局

enter image description here

您将看到,与左同一行(位于VBox的左侧)的中心区域(您具有滚动窗格的位置),因此中心最小高度受左侧高度限制。 当调整窗口大小时,中心高度不会改变,因此滚动窗格的高度也不会改变,它认为仍然没有滚动内容。当它从视口掉出来时

要更改此设置,您需要告诉javaFX,它可以将左VBox的高度调整为所需的值。默认情况下,它将在Windows调整大小时发生。

 leftBox.setMinHeight(0);

说,如果需要,它可以将leftBox的大小调整为零。