在JavaFX应用程序中,我需要将一个固定大小的< code>Canvas居中放置,该画布由< code>StackPane包装,然后是< code>ScrollPane包装在< code>BorderPane中。问题是当我包含< code>ScrollPane时,组件树不再位于< code>BorderPane中心区域的中间。我尝试的一个解决方案是修复< code>ScrollPane的最大尺寸。这是可行的(组件居中),但是产生了一个不同的问题:当任何一个维度(比如宽度)上的视窗区域不足时,两个滚动条都会出现。因为< code>ScrollPane的大小是有限的,所以滚动条在一个维度上占用的额外空间将导致视区在另一个维度上收缩,并且居中所需的max size属性将阻止为其留出更多空间。
以下是该问题的工作演示:
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中运行良好的解决方案似乎没有任何作用,因为我已经使用了一个包装器(< code>StackPane ),它没有帮助。我希望有一个完全依赖于布局的解决方案,而不必回复到为resize事件编写侦听器或绑定到size属性等。
让StackPane填充整个ScrollPane。StackPane将为您居中画布:
堆栈窗格将尝试调整每个子窗格的大小以填充其内容区域。如果子窗格无法调整大小以填充堆栈窗格(因为它不可调整大小或其最大大小阻止了它),则将使用对齐属性在区域内对齐,默认为Pos.CENTER.
因此,您需要做的就是设置ScrollPane的“fitTo…”属性,这样StackPane就会填充它:
scroll.setFitToWidth(true);
scroll.setFitToHeight(true);