Кнопки центрирования в ButtonBar диалогового окна на самом деле на удивление трудно достичь не-хакерским способом.
Ниже представлено лучшее решение, которое я мог бы придумать. Он полагается на dynamic CSS lookup HBox для контейнера кнопок, к которому он затем добавляет спейсерную область справа, чтобы нажимать кнопки влево (по умолчанию реализация ButtonSkin уже помещает неявный разделитель слева, который нажимает кнопки на правый, который я определил с помощью ScenicView). Сочетание левого и правого прокладок выравнивает кнопки в центре. Решение также отменяет создание ButtonBar, чтобы остановить внутреннее переупорядочение ButtonSkin и выполнить дополнительную компоновку кнопок, поскольку, когда это происходит, вы не можете надежно настраивать макет самостоятельно.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.util.Optional;
public class CenteredDialogButtons extends Application {
@Override
public void start(Stage stage) {
Button show = new Button("Show Dialog");
Dialog<ButtonType> dialog = new Dialog<>();
DialogPane dialogPane = new DialogPane() {
@Override
protected Node createButtonBar() {
ButtonBar buttonBar = (ButtonBar) super.createButtonBar();
buttonBar.setButtonOrder(ButtonBar.BUTTON_ORDER_NONE);
return buttonBar;
}
};
dialog.setDialogPane(dialogPane);
dialogPane.getButtonTypes().addAll(ButtonType.OK);
dialogPane.setContentText("Centered Button");
Region spacer = new Region();
ButtonBar.setButtonData(spacer, ButtonBar.ButtonData.BIG_GAP);
HBox.setHgrow(spacer, Priority.ALWAYS);
dialogPane.applyCss();
HBox hbox = (HBox) dialogPane.lookup(".container");
hbox.getChildren().add(spacer);
show.setOnAction(e -> {
Optional<ButtonType> result = dialog.showAndWait();
if (result.isPresent() && result.get() == ButtonType.OK) {
System.out.println("OK");
}
});
StackPane layout = new StackPane(
show
);
layout.setPadding(new Insets(50));
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Причина мне не совсем нравится это решение является то, что динамические CSS поиски рода нарушают API инкапсуляция, как CSS структуры графов сцены JavaFX для управления, такие как кнопки баров не являются частью их публичного API. Тем не менее, я не думаю, что действительно можно получить центрированные кнопки в ButtonBar, используя существующие общедоступные API для JavaFX 8 и скина ButtonBar по умолчанию.
Альтернативным подходом было бы создание пользовательского скина для ButtonBar, связанного с диалоговым окном, но этот подход довольно сложный, и я бы не рекомендовал его для этой задачи.
В принципе, вынос из всего этого, просто оставляйте макет кнопки по умолчанию и заказывайте диалоговые окна, когда можете, а не пытаетесь настроить макет диалогового окна. Если вы хотите, чтобы полностью настраиваемый макет был на уровне таких вещей, как размещение кнопок, то вам может быть лучше просто создать собственный собственный класс диалога с помощью подкласса Stage, а не основывать свою собственную реализацию диалогового окна на встроенном диалоговом классе.
Связанных, но немного другая информация находится в:
кнопку Ok виден в правом нижнем угле диалогового окна, которое является его функцией по умолчанию, но я хочу, чтобы это было показано в нижней части центр диалога. –
Пожалуйста, используйте ссылку [edit], чтобы добавить дополнительную информацию к вопросу. Благодаря! (И, пожалуйста, сделайте код полной программой - это поможет людям воспроизвести то, что вы сделали, и дать вам хороший ответ). См. [Help], как написать [mcve]. –