Java 如何将固定大小的画布包装在边框窗格中的滚动窗格居中?

Java 如何将固定大小的画布包装在边框窗格中的滚动窗格居中?,java,javafx,javafx-8,scrollpane,Java,Javafx,Javafx 8,Scrollpane,在JavaFX应用程序中,我需要将一个固定大小的画布放在边框窗格中,然后是一个滚动窗格。问题是,当我包含滚动窗格< /代码>时,组件树不再集中在边框的中心区域中间。我尝试的一个解决方案是修复滚动窗格的最大大小。这是可行的(组件将居中),但会产生一个不同的问题:当视口区域在任何一个维度(例如,宽度)上不足时,两个滚动条都会出现。由于ScrollPane的大小是有界的,滚动条在一个维度中占用的额外空间将导致视口在另一个维度中收缩,而居中所需的“最大大小”属性将阻止为其提供更多空间 以下是问题的工作演

在JavaFX应用程序中,我需要将一个固定大小的
画布
放在
边框窗格
中,然后是一个
滚动窗格
。问题是,当我包含<代码>滚动窗格< /代码>时,组件树不再集中在边框的中心区域中间。我尝试的一个解决方案是修复
滚动窗格的最大大小。这是可行的(组件将居中),但会产生一个不同的问题:当视口区域在任何一个维度(例如,宽度)上不足时,两个滚动条都会出现。由于
ScrollPane
的大小是有界的,滚动条在一个维度中占用的额外空间将导致视口在另一个维度中收缩,而居中所需的“最大大小”属性将阻止为其提供更多空间

以下是问题的工作演示:

public final class Minimal extends Application {

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

    @Override
    public void start(Stage stage) {
        Canvas canvas = new Canvas(200,200) {
            @Override
            public boolean isResizable() {
                return false;
            }
        };

        StackPane pane = new StackPane(canvas);
        pane.setStyle("-fx-border-insets: 4; -fx-border-style: solid;");
        ScrollPane scroll = new ScrollPane(pane);
        // scroll.setMaxSize(212, 212); // Imperfect Solution
        BorderPane root = new BorderPane();
        root.setCenter(scroll);
        stage.setScene(new Scene(root));
        stage.show();
    }   
}
注释掉该行后,调整大小时,框架显示为:

如果我修改了最大尺寸:则两个滚动条同时显示(请注意,垂直滚动条是不必要的:


我找到的最接近的是,它没有真正的答案。不幸的是,它似乎在Swing中工作得很好,但似乎没有做任何事情,因为我已经在使用包装器(The
StackPane
),但这没有帮助。我希望有一种解决方案完全依赖于布局,而不必重新编写调整大小事件的侦听器或绑定到大小属性等。

让堆栈窗格填充整个滚动窗格。堆栈窗格将:

stackpane将尝试调整每个子项的大小以填充其内容区域。如果无法调整子项的大小以填充stackpane(原因可能是该子项不可调整大小或其最大大小阻止了它),则将使用alignment属性(默认为Pos.CENTER)在区域内对齐

因此,您只需设置ScrollPane的“fitTo…”属性,这样StackPane就会填充它:

scroll.setFitToWidth(true);
scroll.setFitToHeight(true);

你是说当窗口比画布所需的大时,你想让画布居中?你想让它水平居中、垂直居中还是两者都居中?是的,完全正确。水平居中和垂直居中。谢谢!这会导致css样式的边框适合
滚动窗格而不是画布,但这是一个小问题可以通过使用附加的、固定大小的
StackPane
包裹画布,并设置内部
StackPane
的样式,以及使用外部的对中来轻松解决此问题。