[英]How can I center a ScrollPane that wraps a fixed-sized Canvas in a BorderPane?
在JavaFX應用程序中,我需要在BorderPane
居中放置由StackPane
然后是ScrollPane
包裹的固定大小的Canvas
。 問題是當我包含ScrollPane
,組件樹不再位於BorderPane
中心區域的中間。 我嘗試的一種解決方案是固定ScrollPane
的最大大小。 這可以起作用(組件變為居中),但是會產生一個不同的問題:當視口區域在任何一個維度(例如寬度)中都不足夠時,兩個滾動條仍然會出現。 因為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中運行良好,但似乎沒有任何作用,因為我已經在使用包裝器( StackPane
),並且它沒有幫助。 我希望有一種解決方案完全依賴於布局,而不必重新編寫偵聽器來調整大小事件或綁定到size屬性等。
讓StackPane填充整個ScrollPane。 然后,StackPane將為您將畫布居中 :
堆棧窗格將嘗試調整每個子項的大小以填充其內容區域。 如果無法調整子級的大小以填充堆棧窗格(由於無法調整大小或限制其最大尺寸),則將使用alignment屬性將其在區域內對齊,該屬性默認為Pos.CENTER。
因此,您所需要做的就是設置ScrollPane的'fitTo ...'屬性,以便StackPane可以填充它:
scroll.setFitToWidth(true);
scroll.setFitToHeight(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.