У меня есть диалоговое окно 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;
Вот изображение результата. Я хочу снова; либо удалите все пробелы справа от моей сетки, либо охватите мою сетку, чтобы она соответствовала всей ширине.
Я... я... черт возьми! Благодаря тонну! Если вы опубликуете ответ, я отмечу его как ответ.
Боже мой! Это было прямо передо мной, спасибо @VGR. Должно быть, пришло время для еще одной чашки кофе для меня. :)
Используйте GridPane.setHgrow(firstName, Priority.ALWAYS);, чтобы увеличить ширину dialog.getDialogPane().setMinWidth(###);.




Вы пробовали метод 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
Мне придется посмотреть еще раз, когда я вернусь к своему компьютеру, а пока вы пробовали: grid.setPrefWidth(dialog.getDialogPane().getWidth());?
Ага. К сожалению, без кубиков.
Я ненавижу продолжать делать слепые предложения в вашем направлении, но: GridPane.setHgrow(firstName, Priority.ALWAYS); должен позволить TextFields расти, чтобы заполнить сетку.
Без изменений к сожалению. Единственный намек, который у меня есть, заключается в том, что он никогда не выходит за рамки кнопки «Создать учетную запись». Это странно. Я могу установить ширину меньше, чем она, и я получаю ожидаемые результаты. Если я попытаюсь расширить его, он либо расширит весь диалог (сохраняя этот обратный интервал), либо просто не даст никакого эффекта.
Похоже, что любой менеджер компоновки обрабатывает кнопки, не позволяет содержимому GridPane охватывать их. Я не уверен, как вы обойдете это, используя встроенный диалоговый класс JavaFX. Я предполагаю, что вам придется реализовать собственное окно вместо того, чтобы полагаться на диалог. Обновлено: Как заявил @VGR, ваше правое дополнение на вашей GridPane - это то, что вызывает пробел. :)
Размер 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 - правильное дополнение. См. документация по вставкам.
Вы создаете это дополнительное пространство с помощью
grid.setPadding(new Insets(20, 150, 10, 10));. Эти 150 - правильное дополнение. См. документация по вставкам.