JavaFX ScrollPane 在 VBox 中不会改变宽度

普泽特

我的应用程序的主场景使用 VBox 布局并包含一个滚动窗格。尽管使用 setPrefViewportWidth 方法更改了值,但 VBox 布局中的滚动窗格不会在视觉上更改宽度:

VBox mainLayout = new VBox(50);
ScrollPane activityPane = new ScrollPane(new Label("TEST"));
activityPane.setPrefViewportWidth(100); //Width stays the same visually
activityPane.setPrefViewportHeight(50); //Height changes fine

在此处输入图片说明

正如您所看到的,滚动窗格的宽度等于窗口的宽度,这远大于应有的宽度。我该怎么做才能强制滚动窗格采用特定宽度?

宝石海

默认情况下,大多数 JavaFX 元素都可以调整大小。

如果您不希望滚动窗格超出其首选大小,请告诉它不要这样做。

scrollPane.setMaxWidth(ScrollPane.USE_PREF_SIZE);

如果需要,进一步解释

请注意,这是对整个滚动窗格控件(包括边框和滚动条等装饰)的最大宽度设置的约束,而不仅仅是滚动窗格内的视口。

JavaFX 布局实现将根据您设置的滚动窗格视口的首选大小计算和使用整个滚动窗格的首选大小。在计算首选大小时,ScrollPane 的默认布局还将包括用于呈现装饰的额外空间。

通过将最大尺寸限制为首选尺寸,滚动窗格可以根据需要缩小,但永远不会超出首选尺寸。如果您想阻止它缩小,那么您还可以将最小尺寸设置为使用首选尺寸。您也可以对高度执行相同操作,以防您将其放置在 VBox 以外的布局窗格中。

默认情况下,VBox 仅在您告诉它可以这样做时才垂直调整子项的大小,例如通过设置 Vgrow 优先级:(VBox.setVgrow(scrollPane, Priority.ALWAYS);尝试取消注释此行的示例以查看其差异)。但它总是会尝试水平调整元素的大小以填充可用空间。这就是为什么在您的示例中,您看到滚动窗格水平调整大小,而不是垂直调整大小。

如果您想要一个不会调整大小的确切宽度(例如,无论如何它始终是 200 像素宽),那么您可以执行以下操作:

scrollPane.setPrefWidth(200);
scrollPane.setMaxWidth(ScrollPane.USE_PREF_SIZE);
scrollPane.setMinWidth(ScrollPane.USE_PREF_SIZE);

身高也是一样。

这个关于调整大小的信息适用于大多数 JavaFX 控件(按钮有点不同,因为默认情况下它们不会调整超过其首选大小,除非您将最大宽度和高度设置为类似Double.MAX_VALUE);

可执行示例

示例图像

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class RestrictedWidthScrollPaneDemo extends Application {
    @Override
    public void start(Stage stage) {
        ScrollPane scrollPane = new ScrollPane(new Label("TEST"));
        scrollPane.setPrefViewportWidth(100);
        scrollPane.setPrefViewportHeight(50);
        scrollPane.setMaxWidth(ScrollPane.USE_PREF_SIZE);

        VBox layout = new VBox(scrollPane);
//        VBox.setVgrow(scrollPane, Priority.ALWAYS);
        stage.setScene(new Scene(layout, 200, 100));
        stage.show();
    }

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章