【问题标题】:How can I center a ScrollPane that wraps a fixed-sized Canvas in a BorderPane?如何将在 BorderPane 中包裹固定大小的 Canvas 的 ScrollPane 居中?
【发布时间】:2019-11-01 13:39:22
【问题描述】:

在 JavaFX 应用程序中,我需要将固定大小的 Canvas 居中,然后在 BorderPane 中将 StackPaneScrollPane 包裹起来。问题是当我包含ScrollPane 时,组件树不再居中在BorderPane 的中心区域的中间。我尝试的一种解决方案是修复ScrollPane 的最大大小。这可行(组件居中),但会产生不同的问题:当视口区域在任何一个维度(例如宽度)上都不足时,两个滚动条都会出现。因为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();
    }   
}

注释掉该行,调整大小时,框架显示为:

如果我修复了最大尺寸:那么两个滚动条会同时出现(注意垂直的不是必需的:

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

【问题讨论】:

  • 你是说当窗口比 Canvas 需要的大时,你想让 Canvas 居中吗?您希望它水平居中、垂直居中还是两者居中?
  • 是的,完全正确。水平和垂直居中。

标签: java javafx javafx-8 scrollpane


【解决方案1】:

让 StackPane 填满整个 ScrollPane。然后 StackPane 将 center the canvas for you:

堆栈窗格将尝试调整每个子项的大小以填充其内容区域。如果子级无法调整大小以填充堆栈窗格(因为它无法调整大小或其最大大小阻止它),则它将使用对齐属性在区域内对齐,默认为 Pos.CENTER。

因此,您需要做的就是设置 ScrollPane 的“fitTo...”属性,这样 StackPane 就会填充它:

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

【讨论】:

  • 谢谢!这会导致 css 样式的边框适合 ScrollPane 而不是画布,但是这个小问题可以通过使用额外的固定大小的 StackPane 包裹画布并设置内部 StackPane 的样式来轻松解决,并使用用于居中的外层。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多