2016-03-28 5 views
2

Привет, я сейчас играю с GridPane в JavaFX и наткнулся на проблему ... Я хочу создать макет с тремя рядами, где средний растет и занимает все свободное пространство, но я просто не могу заставить его работать. Средний ряд становится слишком большим и «подталкивает» нижний ряд под окном до точки, где он больше не виден ... Как сделать так, чтобы нижняя строка всегда была внизу и позволяла средней строке занимать доступное пространство inbetween, но не более ... Я вставлю свой код ниже.JavaFX - Gridpane Growing Issue

Спасибо!

(Примечание: Код был немного изменен для ясности, но работает точно так же)

RowConstraints row1 = new RowConstraints(25); 
row1.setVgrow(Priority.NEVER); 

RowConstraints row2 = new RowConstraints(); 
row2.setVgrow(Priority.ALWAYS); 

RowConstraints row3 = new RowConstraints(25); 
row3.setVgrow(Priority.NEVER); 

ColumnConstraints column1 = new ColumnConstraints(); 
column1.setPercentWidth(100); 

gridPane.getRowConstraints().add(0, row1); 
gridPane.getRowConstraints().add(1, row2); 
gridPane.getRowConstraints().add(2, row3); 

gridPane.getColumnConstraints().add(0, column1); 

gridPane.add(node1, 0, 0); 
gridPane.add(node2, 0, 1); 
gridPane.add(node3, 0, 2); 

UPDATE! Добавление "Minimal, полный и проверяемый примера"

Test.java

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.MenuBar; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.RowConstraints; 
import javafx.stage.Stage; 

public class Test extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane grid = new GridPane(); 

     MenuBar menuBar = new MenuBar(); 
     TestPane pane = new TestPane(); 

     RowConstraints menuRow = new RowConstraints(25); 

     RowConstraints regRow = new RowConstraints(); 
     regRow.setPercentHeight(100); 

     ColumnConstraints regColumn = new ColumnConstraints(); 
     regColumn.setPercentWidth(100); 

     grid.getColumnConstraints().addAll(regColumn); 
     grid.getRowConstraints().addAll(menuRow, regRow); 

     grid.add(menuBar, 0, 0); 
     grid.add(pane, 0, 1); 

     Scene scene = new Scene(grid, 500, 350); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

TestPane.java

import javafx.scene.control.ListView; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.RowConstraints; 

public class TestPane extends GridPane { 

    public TestPane() { 
     RowConstraints fixedRow = new RowConstraints(25); 
     fixedRow.setVgrow(Priority.NEVER); 

     RowConstraints growingRow = new RowConstraints(); 
     growingRow.setVgrow(Priority.ALWAYS); 

     ColumnConstraints column = new ColumnConstraints(); 
     column.setPercentWidth(100); 

     this.getRowConstraints().addAll(fixedRow, growingRow, fixedRow); 
     this.getColumnConstraints().addAll(column); 

     TextField field1 = new TextField(); 
     ListView list = new ListView<>(); 
     TextField field2 = new TextField(); 

     this.add(field1, 0, 0); 
     this.add(list, 0, 1); 
     this.add(field2, 0, 2); 
    } 
} 
+0

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

+0

@James_D Yepp! Я добавил короткую версию, которая работает и воспроизводит ту же проблему, спасибо за ваш комментарий =) – Estrozix

ответ

0

В вашем "внешнем" контейнере т.е. на панель сетки, определенной в Test, вы имеют две строки. Верхняя строка фиксирована в 25 пикселей, а вторая строка - на 100% от высоты контейнера. Это, очевидно, противоречиво. Что (я думаю) происходит, так это то, что содержимое второй строки получает ту же высоту, что и сама панель сетки (потому что у вас есть percentHeight, установленная на 100%), но она обрезается, потому что не хватает места для ее отображения.

Вместо установки высоты процентов, просто установите vgrow свойство, как вы в TestPane:

RowConstraints menuRow = new RowConstraints(25); 

RowConstraints regRow = new RowConstraints(); 
// regRow.setPercentHeight(100); 
regRow.setVgrow(Priority.ALWAYS); 
+0

Спасибо, полностью пропустил это! – Estrozix

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

  • Нет связанных вопросов^_^