5 votes

Comment définir la position de la boîte de dialogue d'alerte JavaFX avant qu'elle ne soit affichée ?

Je veux définir la position du dialogue d'alerte dans le coin inférieur droit après son affichage.

Voici le code :

package alert;

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class MainAlert extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        Scene scene = new Scene(createContent());
        stage.setScene(scene);
        stage.setMaximized(true);
        stage.show();
    }

    private Parent createContent() {

        StackPane stackPane = new StackPane();

        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Error Dialog");
        alert.setHeaderText("Something went wrong");
        alert.setContentText("There is an error!");

        Button alertButton = new Button("Alert test");
        alertButton.setOnAction(event -> {
            Rectangle2D bounds = Screen.getPrimary().getVisualBounds();

            System.out.println("alert.getWidth() = " + alert.getWidth());
            System.out.println("alert.getHeight() = " + alert.getHeight());

            alert.setX(bounds.getMaxX() - alert.getWidth());
            alert.setY(bounds.getMaxY() - alert.getHeight());
            alert.showAndWait();
        });

        stackPane.getChildren().add(alertButton);

        return stackPane;
    }
}

Mais sa position est dans le coin supérieur gauche. La raison en est que alert.getWidth() y alert.getHeight() reviennent toujours NaN . J'ai déjà essayé Platform.runLater() Malheureusement, cela ne sert à rien.

Comment le réparer ?

1voto

aKilleR Points 949

Utilisez la largeur et la hauteur de l'alerte codées en dur pour définir les paramètres suivants alert.setX() y alert.setY() et instanciez Alert dans l'événement Action

private Parent createContent() {

        StackPane stackPane = new StackPane();

        Button alertButton = new Button("Alert test");
        alertButton.setOnAction(event -> {

            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Error Dialog");
            alert.setHeaderText("Something went wrong");
            alert.setContentText("There is an error!");
            Rectangle2D bounds = Screen.getPrimary().getVisualBounds();
            alert.setX(bounds.getMaxX() - 366);
            alert.setY(bounds.getMaxY() - 185);

            alert.showAndWait();

        });

        stackPane.getChildren().add(alertButton);

        return stackPane;
    }

1voto

onTheFence Points 54

Essayez

Alert alert = new Alert(Alert.AlertType.ERROR);
DialogPane pane = alert.getDialogPane();
pane.setPrefHeight(150.0);
alert.setWidth(pane.getWidth());
Rectangle2D bounds = Screen.getPrimary().getBounds();
alert.setX(bounds.getMaxX() - alert.getWidth());
alert.setY(bounds.getMaxY() - pane.getPrefHeight() - 25);

Le - 25 est nécessaire si vous avez une fenêtre d'alerte décorée. C'est assez laid mais pour l'instant c'est la meilleure solution que j'ai trouvée. Vous pouvez également considérer la barre des tâches du système d'exploitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X