+1 za to, co @JamesD navrhl a @Hoboj odpověď. V ideálním případě by se jednotlivé řady uspořádání, zvládnout to v snadný způsob, než aby to složité pouze pomocí jednoho GridPane.
Having řekl, že, pokud chcete jít s, nebo se dozvědět o tom, jak můžete dělat podobné layouting pomocí jednoho GridPane, níže implementaci může dát rychlou představu.
Za prvé, rozdělit, rozvržení do požadované sloupce, zjistit, kolik celkem sloupce, které potřebujete. (stejně jako v obrázku níže)
Nyní budete vědět, který uzel bude sedět, ve kterém sloupci a kolik sloupců bude zabírat (colspan)
Jsem se vysvětlit, pro jeden uzel:
Řekněme, že chcete-li vložit do pole pro křestní jméno. Pokud si všimnete na obrázku, to je v rowIndex: 0, columnIndex: 1 a to je zabírá 4 sloupce, takže colSpan hodnota bude 4. Tady nejsme kombinuje všechny řádky, takže rowSpan hodnota bude vždy 1.
pane.add(getField(), 1, 0, 4, 1); // node, colIndex, rowIndex, colSpan, rowSpan
Podobně se může vztahovat na ostatní uzly layouting. A také pro další zpřesnění můžete nastavit preferovaný šířka každého sloupce pomocí ColumnConstraints. Níže je kompletní kód pro rozložení a omezení:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class CreditCardPaneDemo extends Application {
@Override
public void start(Stage stage) throws Exception {
VBox root = new VBox();
root.setPadding(new Insets(5));
root.setSpacing(10);
Scene scene = new Scene(root,300,200);
stage.setScene(scene);
stage.setTitle("CreditCard");
stage.show();
GridPane pane = new GridPane();
pane.setStyle("-fx-border-color:black;-fx-border-width:1px;-fx-background-color:yellow");
pane.setPadding(new Insets(5));
pane.setHgap(5);
pane.setVgap(5);
pane.add(getLabel("First"), 0, 0, 1, 1);
pane.add(getField(), 1, 0, 4, 1);
pane.add(getLabel("Last"), 5, 0, 1, 1);
pane.add(getField(), 6, 0, 2, 1);
pane.add(getLabel("Card Number"), 0, 1, 3, 1);
pane.add(getField(), 3, 1, 5, 1);
pane.add(getLabel("Month"), 0, 2, 2, 1);
pane.add(getField(), 2, 2, 2, 1);
pane.add(getLabel("Year"), 4, 2, 1, 1);
pane.add(getField(), 5, 2, 1, 1);
pane.add(getLabel("CVV"), 6, 2, 1, 1);
pane.add(getField(), 7, 2, 1, 1);
pane.getColumnConstraints().addAll(getCc(70), getCc(20), getCc(80), getCc(20), getCc(25), getCc(90), getCc(80), getCc(100));
CheckBox gridLines = new CheckBox("Show grid lines");
gridLines.selectedProperty().addListener((obs, old, val) -> pane.gridLinesVisibleProperty().set(val));
root.getChildren().addAll(gridLines, pane);
}
private ColumnConstraints getCc(double width) {
ColumnConstraints cc = new ColumnConstraints();
cc.setPrefWidth(width);
return cc;
}
private Label getLabel(String txt) {
Label lbl = new Label(txt);
lbl.setMinWidth(Region.USE_PREF_SIZE);
return lbl;
}
private TextField getField() {
TextField field = new TextField();
field.setMaxWidth(Double.MAX_VALUE);
return field;
}
}