代码之家  ›  专栏  ›  技术社区  ›  Will

如何在代码中约束添加到GridPane的节点?

  •  2
  • Will  · 技术社区  · 12 年前

    我需要在代码中向网格窗格添加自定义JavaFX控件。 我设置网格窗格行和列约束如下:

    //These are doubles for the purposes of calculating more accurate percentages, see below.
    //I feel like there should be a better way to accomplish this but I only want 5
    //players per row, so the number of columns would be between 1 and 5 depending on the
    //number of players, but if there are 5 or more, modulus doesn't work (5 % 5 = 0)... 
    //I'm really bothered by this bit but it was the best I could devise.
    double ColumnCount = Math.min(5, this.Settings.PlayerCount());
    //This I feel fine with.
    double RowCount = this.Settings.PlayerCount() / 5;
    
    //The method encapsulating this code is for starting a new game. 
    //This bit is for capturing player names for reassignment.
    ArrayList<String> Names = new ArrayList<>();
    if (this.Players.size()> 0)
        this.Players.stream().forEach((EQLPlayer plr) ->
            Names.add(plr.PlayerName())
        );
    
    //This is for clearing the fields so they can be repopulated appropriately.
    this.Players.clear();
    this.gpPlayerField.getChildren().clear(); //<---- gpPlayerField is the GridPane with which I am working that I am trying to populate.
    this.gpPlayerField.getColumnConstraints().clear();
    this.gpPlayerField.getRowConstraints().clear();
    
    //This bit is for setting up the Column and Row constraints.
    for (int x = 0; x < ColumnCount; x++){
        ColumnConstraints CC = new ColumnConstraints();
        CC.setMaxWidth(200.00);
        CC.setPercentWidth( 100.00 / ColumnCount );
        CC.setHgrow(Priority.ALWAYS);
        this.gpPlayerField.getColumnConstraints().add(CC);
    }
    for (int x = 0; x < RowCount; x++){
        RowConstraints RC = new RowConstraints();
        RC.setMaxHeight(100.00);
        RC.setPercentHeight( 100.00 / RowCount );
        RC.setVgrow(Priority.ALWAYS);
        this.gpPlayerField.getRowConstraints().add(RC);
    }
    

    这就是问题所在(我想,代码的其余部分是为了防止我错过了一些非常明显的东西。

    //I really feel like this should be working but it isn't.
    //I want the rows and columns constrained to the size of the GridPane 
    //(which is constrained to the stage) so that they will grow and shrink with it, but
    //they are pretty much ignoring it.
    for (int x = 0; x < this.Settings.PlayerCount(); x++){
        EQLPlayer plr = new EQLPlayer(x + 1);
        plr.GameMode(this.Settings.Mode());
        if (x < Names.size()) plr.PlayerName(Names.get(x));
        this.gpPlayerField.add(plr, x % 5, x / 5);
        GridPane.setHgrow(plr, Priority.ALWAYS);
        GridPane.setVgrow(plr, Priority.ALWAYS);
    }
    

    因此,我正在添加的控件中绑定了一些方法,当控件大小更改时,这些方法将重新缩放所有标签。当他们只是在舞台或场景上时,这很好,但现在不行了,因为他们只是忽略了约束条件,我不知道为什么。我找不到一个能证明我需要做什么的例子 here 并遵循了这个示例,但这也不起作用。那么…我在这里做错了什么?有没有更好的方法来实现我所期待的结果?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Will    12 年前

    好吧,所以我做的一切都是正确的。 我遇到的问题是自定义控件“最小大小”和“最大大小”设置不正确。 为了实现这一点(为了将来,在不太可能的情况下,任何人都会遇到这种情况),请确保您的最小尺寸(X和Y)和最大尺寸(再次)设置正确。