2015-09-17 2 views
1

У меня есть функция, которая создает и возвращает Pane, которая хранится в другом месте. Это отображается, когда пользователь нажимает кнопку.Javafx 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; 
    } 

Проходя этот объект на сцену возвращается это:

enter image description here

Тем не менее, если добавить его в StackPane первых, я получаю это:

enter image description here

Почему выполняет ли стек стека мою проблему, и что нужно сделать для обеспечения правильного отображения всех панелей? Это ожидаемое поведение?

Если я использую

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(); 
    } 
+0

Возможно, подробно описав, что такое «стек стек», поможет ответить на это? – Clemens

+0

Можете ли вы создать [MCVE]. Я не думаю, что есть много надежды ответить на ваш вопрос с ограниченным контекстом, который вы дали. –

+0

Я добавил указанный пример под изменениями. – Catch44

ответ

1

Это происходит потому, что при изменении размера СТАДИИ TilePane также регулируется, чтобы быть размером рабочей так как ничего не держит.

Когда вы завертываете его в StackPane, он может уважать max, так как StackPane будет изменять размер до нового размера сцены (в этом примере 600x600), оставив TilePane в одиночку на 100X100 в центре StackPane.

Поскольку у вас есть этап на 600 - панель плитки не может быть ограничена до 100 ....

StackPane будет макетом это дети по центру, поэтому она выглядит правильно. Если вы разместили его только на панели, то ваш TilePane будет находиться в верхнем левом углу.

Надеюсь, это поможет.

Смежные вопросы