web-dev-qa-db-fra.com

Alertes JavaFX et leur taille

Récemment, JavaFX a introduit des alertes (Java 8u40).

Considérez l'exemple de code ci-dessous. Comment afficher un message complet plus long que quelques mots? Mes messages (propriété contentText) sont coupés à la fin avec ... et l'alerte n'ajuste pas sa taille correctement à mon avis.

Sur ma machine Linux avec Oracle JDK 8u40, je ne vois que le texte This is a long text. Lorem ipsum dolor sit amet, qui est trop court dans certains cas.

Bien sûr, l'utilisateur peut redimensionner la fenêtre d'alerte manuellement et le texte sera affiché en conséquence, mais ce n'est pas du tout convivial.

Edit: Captures d'écran pour Windows 7 et Linux (JDK d'Oracle): Windows AlertLinux Alert

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;


public class TestAlert extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Alert a = new Alert(AlertType.INFORMATION);
        a.setTitle("My Title");
        a.setHeaderText("My Header Text");
        a.setResizable(true);
        String version = System.getProperty("Java.version");
        String content = String.format("Java: %s.\nThis is a long text. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", version);
        a.setContentText(content);
        a.showAndWait();
    }
}
33
Spiegelritter

J'ai effectué la solution de contournement suivante:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();

La fenêtre se redimensionnera donc automatiquement en fonction du contenu.

44
Clairton Luz

Voici la meilleure solution de contournement sans nombres magiques, redimensionnement, etc.:

Alert alert = new Alert(AlertType.ERROR, "content text");
alert.getDialogPane().getChildren().stream().filter(node -> node instanceof Label).forEach(node -> ((Label)node).setMinHeight(Region.USE_PREF_SIZE));

Cette solution fonctionne sous Windows, Linux et Mac.

17
Sergio

J'ai effectué la solution de contournement suivante il y a quelque temps:

Alert dialog = new Alert(Alert.AlertType.ERROR);
dialog.setHeaderText("Connection Failed");
dialog.setContentText(this.getException().getMessage());

//FIXME: Remove after release 8u40
dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(480, 320);

dialog.showAndWait();

Comme vous pouvez le voir, je viens de définir un drapeau redimensionnable et de définir la taille préférée.

Mais c'est étrange car ce bug devrait être corrigé en 8u40. Utilisez-vous la dernière version de 8u40?

[~ # ~] mise à jour [~ # ~] :

Non corrigé dans 8u40. devrait être corrigé plus tard.

14
Maxim Dobryakov

Une autre solution consiste à sous-classer l'alerte et à y appliquer le style souhaité, par exemple:

class SubAlert extends Alert
{
    {
        setHeaderText("");
        getDialogPane().getStylesheets().add("some_stylesheet");
        getDialogPane().getStyleClass().add("style_class");
        getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
    }

    SubAlert(AlertType alertType)
    {
        super(alertType);
    }
    SubAlert(AlertType type,String title,String content)
    {
        super(type);
        setTitle(title);
        setContentText(content);
    }
}

De cette façon, vous n'avez pas à répéter les actions pour chaque alerte que vous créez.

1
Alexiy