2016-03-28 61 views
2

您好我目前在JavaFX中使用GridPane,并偶然发现一个问题...我想创建一个三行的布局,中间的一个增长并占用所有可用空间,但我只是不能得到它的工作。中间一排变得太大,将窗底下的一排“推”到不再可见的地方......我该怎么做才能使底排始终位于底部,并让中排占据可用空间inbetween,但没有更多......我会粘贴我的代码在下面。JavaFX - Gridpane增长问题

谢谢!

(注:该代码已经稍微改变为清晰起见,但以同样的方式)

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); 

更新!添加一个 “最小的,完整的和可验证的例子”

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