簡體   English   中英

如何將將固定尺寸的Canvas包裹在BorderPane中的ScrollPane居中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM