簡體   English   中英

Javafx窗格“忘記”布局

[英]Javafx Pane “forgets” layout

我有一個創建並返回Pane的函數,該函數存儲在其他位置。 當用戶按下按鈕時顯示。

public Pane createBoard(Board d){
        TilePane tilepane = new TilePane();
        pane.setPrefColumns(8);
        pane.setPrefRows(8);
        pane.setMaxSize(400,400);
        pane.setMinSize(400,400);

        for(Cell c : d.getCells()){
            pane.getChildren().add(c);
        }    

        return tilepane;
    }

將此對象傳遞到場景將返回以下內容:

在此處輸入圖片說明

但是,如果我首先將其添加到StackPane中,則會得到以下信息:

在此處輸入圖片說明

為什么stackpane可以“解決”我的問題,並且應該采取什么措施來確保正確顯示所有窗格? 這是預期的行為嗎?

如果我用

Pane tilepane = createBoard(new Board());
StackPane stackpane = new StackPane();
stackpane.getchildren().add(tilepane);
Scene scene = new Scene(stackpane,600,600);

我得到了預期的結果。

如果我使用:

Pane tilepane = createBoard(new Board());
Scene scene = new Scene(tilepane,600,600);

我得到第一張圖片。


編輯:

StackPane基本上將所有子節點直接放置在彼此之上。 在這個問題的上下文中,我使用的StackPane只有一個孩子,即TilePane。

例:

非工作:

 public void start(Stage primaryStage) {   

        TilePane tp = new TilePane();
        tp.setPrefColumns(5);
        tp.setPrefRows(5);
        tp.setMaxSize(100, 100);

        ArrayList<Rectangle> rectangles = new ArrayList();

        for(int i = 0;i<25;i++){
        rectangles.add(new Rectangle(20,20));
        }

        for(int i = 0;i<25;i++){
        rectangles.get(i).setFill(Color.rgb(i*2, i*9, i*6));
        }
        tp.getChildren().addAll(rectangles);

        Scene scene = new Scene(tp, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

工作:

 public void start(Stage primaryStage) {   


        TilePane tp = new TilePane();
        tp.setPrefColumns(5);
        tp.setPrefRows(5);
        tp.setMaxSize(100, 100);

        ArrayList<Rectangle> rectangles = new ArrayList();

        for(int i = 0;i<25;i++){
        rectangles.add(new Rectangle(20,20));
        }

        for(int i = 0;i<25;i++){
        rectangles.get(i).setFill(Color.rgb(i*2, i*9, i*6));
        }
        tp.getChildren().addAll(rectangles);

        StackPane stack = new StackPane();                            <-- Added
        stack.getChildren().add(tp);                                 <--Added
        Scene scene = new Scene(stack, 600, 600);                    <-- Changed to stack from tp
        primaryStage.setScene(scene);
        primaryStage.show();
    }

這是因為在調整舞台大小時,由於沒有任何支撐,因此TilePane也被調整為舞台的大小。

當您將其包裝在StackPane中時,它可以遵守最大值,因為StackPane會調整為新的舞台大小(在本示例中為600x600),而TilePane單獨放置在StackPane的中心為100X100。

由於您的舞台為600,因此不能將瓷磚窗格限制為100 ....

StackPane將布局以孩子為中心,這就是為什么它看起來正確的原因。 如果僅將其放在窗格上,則TilePane將位於左上角。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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