Содержимое диалогового окна не будет охватывать всю ширину диалогового окна

У меня есть диалоговое окно JavaFX, и кажется, что содержимое сетки не охватывает всю ширину диалогового окна. Прямо сейчас он простирается до МАКСИМУМА левой стороны диалогового окна, до ширины кнопки ОК. Я хотел бы либо удалить пробел справа от полей ввода. Или охватывать всю ширину.

Я пробовал:

  • Установка минимальной ширины сетки

  • Установка минимальной ширины текстовых полей

  • Настройка ширины сцены

Я в значительной степени в недоумении здесь.

Вот мой код!

// Create the custom dialog.
Dialog dialog = new Dialog<>();

dialog.initOwner(mainStage);

// Set Custom Icon
Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
stage.getIcons().add(new Image(Constants.kApplicationIcon));

dialog.getDialogPane().getStylesheets().add(Constants.kRootStylesheet);
dialog.getDialogPane().getStyleClass().add("accountDialog");

dialog.setTitle("New User Detected");
dialog.setHeaderText("Please complete user registration!");

// Set the button types.
ButtonType loginButtonType = new ButtonType("Create Account", ButtonBar.ButtonData.OK_DONE);
dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL);

// Create the username and password labels and fields.
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
grid.setAlignment(Pos.CENTER);
grid.setId("accountGrid");

TextField firstName = new TextField("First Name");
TextField lastName = new TextField("Last Name");

TextField email = new TextField("Email");
TextField gender = new TextField("Gender");

firstName.setId("textField");
lastName.setId("textField");

firstName.setPromptText("");
lastName.setPromptText("");

gender.setPromptText("");
email.setPromptText("");

email.setId("textField");
gender.setId("textField");

ToggleGroup studentRadioGroup = new ToggleGroup();

RadioButton mentorRadio = new RadioButton("Mentor");
RadioButton studentRadio = new RadioButton("Student");

studentRadio.fire();

mentorRadio.setToggleGroup(studentRadioGroup);
studentRadio.setToggleGroup(studentRadioGroup);

grid.add(new Label("First Name:"), 0, 0);
grid.add(firstName, 1, 0);
grid.add(new Label("Last Name:"), 0, 1);
grid.add(lastName, 1, 1);
grid.add(new Label("Email:"), 0, 2);
grid.add(email, 1, 2);
grid.add(new Label("Gender:"), 0, 3);
grid.add(gender, 1, 3);

GridPane.setHalignment(grid, HPos.CENTER);

GridPane.setHalignment(studentRadio, HPos.CENTER);
GridPane.setHalignment(studentRadio, HPos.CENTER);

grid.add(studentRadio, 0, 4);
grid.add(mentorRadio, 1, 4);

grid.setGridLinesVisible(true);

// Enable/Disable login button depending on whether a username was entered.
Node loginButton = dialog.getDialogPane().lookupButton(loginButtonType);
loginButton.setDisable(true);

// Do some validation (using the Java 8 lambda syntax).
firstName.textProperty().addListener((observable, oldValue, newValue) -> {
    loginButton.setDisable(newValue.trim().isEmpty());
});

dialog.getDialogPane().setContent(grid);

// Request focus on the firstname field by default.
Platform.runLater(firstName::requestFocus);

Optional<ButtonType> result = dialog.showAndWait();
ArrayList<String> data = new ArrayList<>();

System.out.println(result.get().toString());

if (result.get().getButtonData() == ButtonBar.ButtonData.OK_DONE) {
    data.add("TRUE");
    data.add(firstName.getText());
    data.add(lastName.getText());
    data.add(email.getText());
    data.add(gender.getText());
    data.add(mentorRadio.isSelected() ? "TRUE" : "FALSE");

} else {
    data.add("FALSE");

}

return data; 

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

Изображение результата

Вы создаете это дополнительное пространство с помощью grid.setPadding(new Insets(20, 150, 10, 10));. Эти 150 - правильное дополнение. См. документация по вставкам.

VGR 31.01.2019 20:13

Я... я... черт возьми! Благодаря тонну! Если вы опубликуете ответ, я отмечу его как ответ.

Dalton Smith 31.01.2019 20:22

Боже мой! Это было прямо передо мной, спасибо @VGR. Должно быть, пришло время для еще одной чашки кофе для меня. :)

Dustin R 31.01.2019 20:35

Используйте GridPane.setHgrow(firstName, Priority.ALWAYS);, чтобы увеличить ширину dialog.getDialogPane().setMinWidth(###);.

Sedrick 31.01.2019 20:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
339
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пробовали метод setExpandableContent() из диалогового окна? Вы можете передать любой узел, который вам нравится, и тогда он сможет изменить размер, чтобы соответствовать всему предупреждению.

Пример установки GridPane в качестве содержимого оповещения.

GridPane() grid = new GridPane();
Alert alert = new Alert(AlertType.INFORMATION);
alert.getDialogPane().setExpandableContent(grid);

Только что попробовал. Все, что он делает, это имеет его как расширяемый узел (скрываемый и не скрываемый) и даже еще больше разбивает интервалы. Хотя делал dialog.getDialogPane().setExpandableContent(grid);i.imgur.com/Wt993X3.png

Dalton Smith 31.01.2019 19:49

Мне придется посмотреть еще раз, когда я вернусь к своему компьютеру, а пока вы пробовали: grid.setPrefWidth(dialog.getDialogPane().getWidth());?

Dustin R 31.01.2019 19:52

Ага. К сожалению, без кубиков.

Dalton Smith 31.01.2019 19:56

Я ненавижу продолжать делать слепые предложения в вашем направлении, но: GridPane.setHgrow(firstName, Priority.ALWAYS); должен позволить TextFields расти, чтобы заполнить сетку.

Dustin R 31.01.2019 20:00

Без изменений к сожалению. Единственный намек, который у меня есть, заключается в том, что он никогда не выходит за рамки кнопки «Создать учетную запись». Это странно. Я могу установить ширину меньше, чем она, и я получаю ожидаемые результаты. Если я попытаюсь расширить его, он либо расширит весь диалог (сохраняя этот обратный интервал), либо просто не даст никакого эффекта.

Dalton Smith 31.01.2019 20:04

Похоже, что любой менеджер компоновки обрабатывает кнопки, не позволяет содержимому GridPane охватывать их. Я не уверен, как вы обойдете это, используя встроенный диалоговый класс JavaFX. Я предполагаю, что вам придется реализовать собственное окно вместо того, чтобы полагаться на диалог. Обновлено: Как заявил @VGR, ваше правое дополнение на вашей GridPane - это то, что вызывает пробел. :)

Dustin R 31.01.2019 20:34

Размер GridPane изменен до предпочтительного размера. Заполнение справа от 150 предотвращает увеличение TextField в этом направлении.

grid.setPadding(new Insets(20, 150, 10, 10)); // sets right padding to 150

Если вы хотите увеличить TextField до максимального размера, который Label/RadioButton слева оставляет, вы должны использовать ColumnConstraint, чтобы указать, что второй столбец всегда должен увеличиваться:

ColumnConstraints constraints = new ColumnConstraints();
constraints.setHgrow(Priority.ALWAYS);

grid.getColumnConstraints().addAll(new ColumnConstraints(), constraints);

Также возможно указать предпочтительную ширину второго столбца через объект ColumnConstraints.

Чтобы проверить поведение при изменении размера окна, вы можете изменить размер диалогового окна:

dialog.setResizable(true);

Чтобы увидеть область покрытия GridPane, может быть полезно назначить фон:

grid.setStyle("-fx-background-color: red;");
Ответ принят как подходящий

Вы создаете это дополнительное пространство с помощью grid.setPadding(new Insets(20, 150, 10, 10));. Эти 150 - правильное дополнение. См. документация по вставкам.

Другие вопросы по теме