Как охватить столбцы gridpane вручную в javafx?
Я пытаюсь создать макет с gridpane, который содержит 2 строки и 2 столбца. Верхняя левая область и верхняя правая область разделяют ширину, они оба получают 50% от нее. Но во второй строке мне нужна нижняя правая область, чтобы получить 60% ширины, поэтому нижняя левая область 40%.
Я тоже пробовал столбцы spaning как [[2col.,2col][1col,3col]] матрица. Это тоже не сработало.
вот мой код;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Group root = new Group();
primaryStage.setTitle("Hello World");
Scene scene = new Scene(root, 1700, 1200);
//zoneTopLeft, spans 2 column
VBox zoneTopLeft = createBaseContainer();
//zoneTopRight, spans 2 columns
VBox zoneTopRight = createBaseContainer();
//zoneBottomLeft, spans 1 columns
VBox zoneBottomLeft = createBaseContainer();
//zoneBottomRight,spans 3 columns
VBox zoneBottomRight = createBaseContainer();
ColumnConstraints topRight=new ColumnConstraints();
topRight.setPrefWidth(300);
ColumnConstraints topLeft=new ColumnConstraints();
topRight.setPrefWidth(300);
ColumnConstraints bottomRight=new ColumnConstraints();
topRight.setPrefWidth(400);
ColumnConstraints bottomLeft=new ColumnConstraints();
topRight.setPrefWidth(200);
GridPane page=new GridPane();
page.getColumnConstraints().addAll(topLeft,topRight,bottomLeft,bottomRight);
page.setHgap(10);
page.setVgap(10);
page.add(zoneTopLeft, 0, 0);
// page.setColumnSpan(zoneTopLeft, 2);
page.add(zoneTopRight, 1, 0); //2,0 for spaning
// page.setColumnSpan(zoneTopRight,2);
page.add(zoneBottomLeft, 0, 1);
// page.setColumnSpan(zoneBottomLeft,1);
page.add(zoneBottomRight, 1, 1);
// page.setColumnSpan(zoneBottomRight,3);
root.getChildren().addAll(page);
primaryStage.setScene(scene);
primaryStage.show();
}
private VBox createBaseContainer() {
VBox base = new VBox(); // box
base.setPrefWidth(250);
base.setPrefHeight(200);
base.setStyle("-fx-border-width: 1;-fx-border-color: red");
// base.prefWidthProperty().bind(scene.widthProperty());
BorderPane top = new BorderPane(); // top area of base
top.prefWidthProperty().bind(base.prefWidthProperty());
top.setPrefHeight(33);
top.setLeft(setBaseTitle());
top.setRight(setBaseButtons());
top.setStyle("-fx-border-width: 1;-fx-border-color: blue");
StackPane bottom = new StackPane(); // bottom are of base, content keeper
base.getChildren().addAll(top, bottom);
return base;
}
private Node setBaseButtons() {
return new HBox();
}
private Node setBaseTitle() {
return new Label();
}
public static void main(String[] args) {
launch(args);
}
2 ответов
на GridPane
, подумайте об этом как о трех столбцах с шириной 40%, 10% и 50%. Верхний левый узел охватывает первый и второй столбцы, верхний правый-только третий столбец. Нижний левый находится только в первом столбце, нижний правый охватывает второй и третий столбцы.
что-то типа:
| c1 |c2| c3 |
_________________________
|-----------|-----------|
|--------|--------------|
в коде сделайте что-то вроде:
Node topLeft ;
Node topRight ;
Node bottomLeft ;
Node bottomRight ;
GridPane page = new GridPane();
// page.add(Node, colIndex, rowIndex, colSpan, rowSpan):
page.add(topLeft, 0, 0, 2, 1);
page.add(topRight, 2, 0, 1, 1);
page.add(bottomLeft, 0, 2, 1, 1);
page.add(bottomRight, 1, 1, 2, 1);
ColumnConstraints col1Constraints = new ColumnConstraints();
col1Constraints.setPercentWidth(40);
ColumnConstraints col2Constraints = new ColumnConstraints();
col2Constraints.setPercentWidth(10);
ColumnConstraints col3Constraints = new ColumnConstraints();
col3Constraints.setPercentWidth(50);
page.getColumnConstraints().addAll(col1Constraints, col2Constraints, col3Constraints);
Edit: текст изменен с getColumnContraints на getColumnConstraints.
там есть очень хорошее решение от @James_D. В моем коде я присваивал одинаковые размеры всем vBoxes. Таким образом, есть еще одно решение этой проблемы - на самом деле мы можем назвать это исправлением основной ошибки. Вот рабочий код:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Group root = new Group();
primaryStage.setTitle("Hello World");
Scene scene = new Scene(root, 650, 550);
VBox zoneTopLeft = createBaseContainer(300,300);
VBox zoneTopRight = createBaseContainer(300,300);
VBox zoneBottomLeft = createBaseContainer(200,200);
VBox zoneBottomRight = createBaseContainer(400,200);
GridPane page=new GridPane();
page.setHgap(10);
page.setVgap(10);
page.add(zoneTopLeft, 0, 0);
page.setColumnSpan(zoneTopLeft, 2);
page.add(zoneTopRight, 2, 0);
page.setColumnSpan(zoneTopRight,2);
page.add(zoneBottomLeft, 0, 1);
page.add(zoneBottomRight, 1, 1);
page.setColumnSpan(zoneBottomRight,3);
root.getChildren().addAll(page);
primaryStage.setScene(scene);
primaryStage.show();
}
private VBox createBaseContainer(double width,double height) {
VBox base = new VBox(); // box
base.setPrefWidth(width);
base.setPrefHeight(height);
base.setStyle("-fx-border-width: 1;-fx-border-color: red");
// base.prefWidthProperty().bind(scene.widthProperty());
BorderPane top = new BorderPane(); // top area of base
top.prefWidthProperty().bind(base.prefWidthProperty());
top.setPrefHeight(33);
top.setLeft(setBaseTitle());
top.setRight(setBaseButtons());
top.setStyle("-fx-border-width: 1;-fx-border-color: blue");
StackPane bottom = new StackPane(); // bottom are of base, content keeper
base.getChildren().addAll(top, bottom);
return base;
}
private Node setBaseButtons() {
return new HBox();
}
private Node setBaseTitle() {
return new Label();
}
public static void main(String[] args) {
launch(args);
}