ループ内のx行ごとに行間に少しスペースを追加したいと思います。これは、行に特定の制約を設定するよりも、GridPaneに空の行を追加する方が良いと思います。問題は、空の要素を偽造するためにその行にどのノードを配置すべきかわからないことです。テキストノードと言ってやることができます。しかし、これは本当に正しいですか?誰もがよりエレガントなソリューションを提供できますか?
gridPane.addRow(i, new Text(""));
ループ内のx行ごとに行間に少しスペースを追加したいと思います。これは、行に特定の制約を設定するよりも、GridPaneに空の行を追加する方が良いと思います。問題は、空の要素を偽造するためにその行にどのノードを配置すべきかわからないことです。テキストノードと言ってやることができます。しかし、これは本当に正しいですか?誰もがよりエレガントなソリューションを提供できますか?
gridPane.addRow(i, new Text(""));
空のグリッドペイン行を作成するために空の文字列を持つテキストノードを使用することは問題ありません。
別の方法として、以下のサンプルでは、ペインを使用して空のグリッド行の「スプリング」ノードを作成します。これにより、必要なギャップサイズを実現するために、必要な高さに設定された優先高さを設定できます。さらに、必要に応じて、スプリングノードをcssでスタイル設定することもできます。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
// GridPane with a blank row
// http://stackoverflow.com/questions/11934045/how-to-add-empty-row-in-gridpane-in-javafx
public class GridPaneWithEmptyRowSample extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(final Stage stage) throws Exception {
// create nodes for the grid.
final Label label1 = new Label("Label 1");
final Label label2 = new Label("Label 2");
final Label label3 = new Label("Label 3");
final Pane spring = new Pane();
spring.minHeightProperty().bind(label1.heightProperty());
// layout the scene.
final GridPane layout = new GridPane();
layout.add(label1, 0, 0);
layout.add(spring, 0, 1);
layout.add(label2, 0, 2);
layout.add(label3, 0, 3);
layout.setPrefHeight(100);
stage.setScene(new Scene(layout));
stage.show();
}
}
これを解決する最善の方法は、RowConstraintsを追加し、の各行の高さを設定することだと思いますGridpane
。次に、「空の」行を追加する必要はありません。これは、各行に何かが含まれているかどうかに関係なく、各行が同じスペースを取得するためです。
最小限の完全で検証可能な例を次に示します。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class SSCCE extends Application {
@Override
public void start(Stage stage) {
VBox root = new VBox();
GridPane gridPane = new GridPane();
gridPane.add(new Label("First"), 0, 0);
gridPane.add(new Label("Second"), 0, 2);
gridPane.add(new Label("Third"), 0, 3);
// Add one RowConstraint for each row. The problem here is that you
// have to know how many rows you have in you GridPane to set
// RowConstraints for all of them.
for (int i = 0; i <= 3; i++) {
RowConstraints con = new RowConstraints();
// Here we set the pref height of the row, but you could also use .setPercentHeight(double) if you don't know much space you will need for each label.
con.setPrefHeight(20);
gridPane.getRowConstraints().add(con);
}
root.getChildren().add(gridPane);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
このメソッドの問題は、私の知る限り、GridPaneの行数を取得する簡単な方法がなく、のRowConstraint
すべての行に同じ量の行を追加する簡単な方法がないことGridPane
です。これにより、コードがかなり乱雑になります。ただし、これを解決するには、たとえば、サイズを追跡するGridPaneに独自のサブクラスを作成します。
上記の例では、行の設定の高さを設定していますが、各ラベルに必要なスペースがわからない場合は、.setPercentHeight(double)を使用することもできます。
GridPane gp = new GridPane();
gp.add(" ",2, 2);