Как я могу добавить текстовое поле в javafx, не перемещая кнопки - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь создать программу javafx для отображения текстового поля и кнопок, но каждый раз, когда я добавляю текстовое поле, происходит смещение кнопок.

    GridPane pane = new GridPane();
    pane.setAlignment(Pos.CENTER);
    pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
    pane.setHgap(6);
    pane.setVgap(7);

    pane.add(new Label("Text1:"), 0, 3);
    pane.add(new TextField(), 1, 3);
    pane.add(new TextField(), 1, 3, 1, 1);
    pane.add(new Label("Text2:"), 2, 3);
    pane.add(new TextField(), 3, 3);
    pane.add(new Label("Text3:"), 4, 3);
    pane.add(new TextField(), 5, 3);

    Button bt1 = new Button("Button");
    bt1.setMinSize(70, 0);
    pane.add(bt1, 1, 4);
    Button bt2 = new Button("Button");
    bt2.setMinSize(70, 0);
    pane.add(bt2, 2, 4);
    Button bt3 = new Button("Button");
    bt3.setMinSize(70, 0);
    pane.add(bt3, 3, 4);

Я хочу, чтобы текстовое поле располагалось ближе к метке, а между кнопками оставалось меньше места.

1 Ответ

2 голосов
/ 21 июня 2019

A GridPane выравнивает узлы в одной и той же строке / столбце и (при условии, что не используются интервалы между строками / столбцами, кроме 1) гарантирует, что узлы, расположенные в разных строках / столбцах, не перекрывают диапазон, занимаемый узлом по вертикали / горизонтали.

Вы пытаетесь выровнять Label s / TextField s и Button s независимо, хотя это не работает, по крайней мере, если вы не усложняете задачу.

Вместо использования GridPane, я рекомендую просто использовать VBox, содержащий вместо 2 HBox es:

@Override
public void start(Stage primaryStage) throws Exception {
    HBox textFieldContainer = new HBox(
            new Label("Text1:"),
            new TextField(),
            new Label("Text2:"),
            new TextField(),
            new Label("Text3:"),
            new TextField());
    textFieldContainer.setSpacing(6);
    textFieldContainer.setAlignment(Pos.CENTER_LEFT);

    // add margin to all but the first Label/TextField pairs
    Insets innerLabelInsets = new Insets(0, 0, 0, 20);
    List<Node> children = textFieldContainer.getChildren();
    for (int i = 2, size = children.size(); i < size; i +=2) {
        HBox.setMargin(children.get(i), innerLabelInsets);
    }

    Button bt1 = new Button("Button");
    bt1.setMinSize(70, 0);
    Button bt2 = new Button("Button");
    bt2.setMinSize(70, 0);
    Button bt3 = new Button("Button");
    bt3.setMinSize(70, 0);
    HBox buttonContainer = new HBox(bt1, bt2, bt3);
    buttonContainer.setSpacing(6);

    VBox pane = new VBox(textFieldContainer, buttonContainer);
    pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
    pane.setSpacing(7);

    Scene scene = new Scene(pane);

    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...