【发布时间】:2019-11-01 13:39:22
【问题描述】:
在 JavaFX 应用程序中,我需要将固定大小的 Canvas 居中,然后在 BorderPane 中将 StackPane 和 ScrollPane 包裹起来。问题是当我包含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