javafx滚动窗格在vbox中时不会更改宽度

vjrehmav  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(318)

我的应用程序的主场景使用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


正如您所看到的,滚动窗格的宽度相当于窗口的宽度,而窗口的宽度远远大于其应有的宽度。如何强制滚动窗格采用特定的宽度?

vs91vp4v

vs91vp4v1#

默认情况下,大多数javafx元素都可以调整大小。
如果您不希望滚动窗格超出其首选大小,请告诉它不要这样做。

scrollPane.setMaxWidth(ScrollPane.USE_PREF_SIZE);

如有需要,请进一步解释
注意,这是对整个滚动窗格控件(包括边框和滚动条等装饰)的最大宽度设置约束,而不仅仅是滚动窗格内的视口。
javafx布局实现将根据您设置的滚动窗格视口的首选大小计算并使用整个滚动窗格的首选大小。计算首选大小时,scrollpane的默认布局还将包括用于渲染装饰的额外空间。
通过将最大大小限制为首选大小,滚动窗格可以根据需要缩小,但永远不会超过首选大小。如果要停止收缩,还可以将最小大小设置为使用首选大小。如果将高度放置在vbox以外的布局窗格中,也可以对高度执行相同的操作。
默认情况下,如果您告诉vbox可能会垂直调整子对象的大小,则vbox仅会垂直调整子对象的大小,例如,通过设置vgrow priority: 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();
    }
}

相关问题