JavaFX ScrollPane [setPrefSize, setMinSize, setMaxSize] 不工作

JavaFX ScrollPane [ setPrefSize, setMinSize, setMaxSize ] not working

我正在编写带有 ScrollPane 的 GUI 应用程序,但在调整大小方面遇到了一些问题。我在以下示例中提取了基本代码:

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.VBox;
import javafx.scene.control.ScrollPane;

public class JavaFXExample extends Application {

    final int width = 300;
    final int height = 300;

    @Override
    public void start(Stage primaryStage) {

        Button b = new Button("This should be at the bottom!");

        //this vbox goes inside the scrollpane
        VBox boxInScrollPane = new VBox(10);
        boxInScrollPane.setAlignment(Pos.BOTTOM_CENTER);
        boxInScrollPane.getChildren().add(b);

        //main content
        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setContent(boxInScrollPane);
        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);

        //Doesn't do anything!
        scrollPane.setPrefSize(100, 100);
        scrollPane.setMaxSize(100, 100);
        scrollPane.setMinSize(100, 100);

        Scene scene = new Scene(scrollPane, width, height);

        primaryStage.setScene(scene);
        primaryStage.show();


        //set size of boxInScrollPane to be equal to the viewport
        Bounds viewportBounds = scrollPane.getViewportBounds();
        double innerWidth = viewportBounds.getMaxX() - viewportBounds.getMinX();
        double innerHeight = viewportBounds.getMaxY() - viewportBounds.getMinY();
        System.out.println(innerWidth + " " + innerHeight);
        boxInScrollPane.setPrefSize(innerWidth, innerHeight);

    }

    public static void main(String[] args) {
        launch(args);
    }

}

所以我有一个 window,它包含一个 ScrollPane,它包含一个 VBox,它包含一个按钮。这里的示例是任意的,我将滚动窗格的大小调整为 300x300px window 中的 100x100px。重要的是,当我 运行 这段代码时,我得到一个填满整个 window 的滚动窗格!这是我的输出:

这是怎么回事?

解决方案:

Pane pane = new Pane(scrollPane);
Scene scene = new Scene(pane, width, height);

primaryStage.setScene(scene);

primaryStage.show();

来自场景构造函数文档:

Creates a Scene for a specific root Node with a specific size.

将 ScrollPane 设置为根节点将使其在构造函​​数中调整为给定大小,因此之前的设置将不起作用。

解决方案是制作一个可以调整大小的简单窗格,这样 ScrollPane 就会有自己的规则。

无论min/pref/max 大小如何,场景根的大小都会填满整个场景。如果您希望 ScrollPane 保持 100 像素宽和 100 像素高,请将其包装在另一个容器中(几乎任何容器都可以);然后将调整容器的大小,但 ScrollPane 将遵守其布局大小:

Scene scene = new Scene(new StackPane(scrollPane), width, height);

默认情况下 StackPane 将其内容居中,因此这会导致