Saltar al contenido

¿Cómo alinear el botón Aceptar de un panel de diálogo en Javafx?

Queremos darte la mejor respuesta que hallamos por todo internet. Esperamos que te sea de mucha utilidad y si puedes compartir algo que nos pueda ayudar a crecer hazlo con total libertad.

Solución:

Centrar los botones en la barra de botones de un cuadro de diálogo es sorprendentemente difícil de lograr de una manera que no sea pirateada.

A continuación se muestra la mejor solución que se me ocurrió. Se basa en una búsqueda dinámica de CSS del HBox para el contenedor del botón, al que luego agrega una región espaciadora a la derecha para empujar los botones hacia la izquierda (la implementación predeterminada de ButtonSkin ya coloca un espaciador implícito de la izquierda que empuja los botones a la derecha, que determiné usando ScenicView). La combinación de los espaciadores izquierdo y derecho termina alineando los botones en el centro. La solución también anula la creación de ButtonBar para evitar que ButtonSkin reordene internamente y realice un diseño adicional de botones, ya que, cuando lo hace, no puede personalizar el diseño de manera confiable.

botón centrado

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 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 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);
    

La razón por la que no me gusta esta solución es que las búsquedas dinámicas de CSS violan la encapsulación de la API, ya que la estructura CSS de los gráficos de escena JavaFX para controles como las barras de botones no es realmente parte de su API pública. Sin embargo, no creo que sea realmente posible obtener botones centrados en una barra de botones utilizando las API públicas existentes para JavaFX 8 y una máscara de barra de botones predeterminada.

Un enfoque alternativo sería crear una máscara personalizada para la barra de botones asociada con el cuadro de diálogo, pero ese enfoque es bastante difícil y no lo recomendaría para esta tarea.

Básicamente, la conclusión de todo esto es que simplemente deje el diseño de botones predeterminado y ordene los cuadros de diálogo siempre que pueda, en lugar de intentar personalizar el diseño de los botones de diálogo. Si desea tener un diseño completamente personalizado al nivel de cosas como la ubicación de los botones, entonces es mejor que simplemente cree su propia clase de diálogo personalizada subclasificando Stage en lugar de basar su implementación de diálogo personalizado en la clase de diálogo integrada.

Información relacionada, pero ligeramente diferente, está en:

  • ¿Introducir evento clave no funciona en el cuadro de diálogo en Javafx?

Agregue este método a su código y llámelo cuando necesite alinear los botones en un Diálogo o Alerta:

    private void centerButtons(DialogPane dialogPane) 
      Region spacer = new Region();
      ButtonBar.setButtonData(spacer, ButtonBar.ButtonData.BIG_GAP);
      HBox.setHgrow(spacer, Priority.ALWAYS);
      dialogPane.applyCss();
      HBox hboxDialogPane = (HBox) dialogPane.lookup(".container");
      hboxDialogPane.getChildren().add(spacer);
   

Llámalo de esta manera: centerButtons(dialog.getDialogPane);

Reseñas y valoraciones de la guía

Recuerda algo, que tienes la capacidad de valorar esta sección si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *