2

カスタム 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);
}

したがって、追加するコントロールには、コントロールのサイズが変更されたときにすべてのラベルを再スケーリングするメソッドが関連付けられています。これは、単にステージやシーンにいるときは問題なく機能していましたが、制約を無視しているだけで、理由がわからないため、機能しなくなりました。何をする必要があるかを示す例を実際に見つけることができませんでした。私はここをチェックして例に従いましたが、それもうまくいきませんでした。だから...ここで何が間違っているのですか?私が探している結果を達成するためのより良い方法はありますか?

4

1 に答える 1

1

よし、私がしたことはすべて正しかった。私が抱えていた問題は、カスタム コントロールの最小サイズと最大サイズが正しく設定されていなかったことです。これを機能させるには (万一これに遭遇した場合に備えて)、最小サイズ (X と Y の両方) と最大サイズ (再び) が適切に設定されていることを確認してください。

于 2014-07-28T00:55:23.977 に答える