Il se peut que quelque chose de très évident me manque, mais je ne parviens pas à savoir comment définir l'icône pour un composant Dialog (ProgressDialog pour être plus précis). Je sais comment faire cela pour une scène, this.primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/icon/Logo.png")));
mais je ne trouve rien pour la famille Dialog. Et d'une manière ou d'une autre, le réglage de l'icône de la scène n'influence pas l'icône de la boîte de dialogue.
Merci
Il existe un excellent tutoriel ici de Marco Jakob, où vous pouvez trouver non seulement comment utiliser les boîtes de dialogue, mais également comment résoudre votre problème.
Que ce soit pour les nouveaux dialogues (dans les versions antérieures de JDK8u40 ou avec openjfx-dialogs avec JDK 8u25), ou pour ceux dans ControlsFX , vous pouvez utiliser ceci Solution :
Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
stage.getIcons().add(
new Image(this.getClass().getResource("<image>.png").toString()));
Cet extrait de code montre comment utiliser une ProgressDialog
, à partir de ControlsFX, et définir une icône pour la boîte de dialogue:
@Override
public void start(Stage primaryStage) {
Service<Void> service = new Service<Void>() {
@Override protected Task<Void> createTask() {
return new Task<Void>() {
@Override protected Void call() throws InterruptedException {
updateMessage("Message . . .");
updateProgress(0, 10);
for (int i = 0; i < 10; i++) {
Thread.sleep(300);
updateProgress(i + 1, 10);
updateMessage("Progress " + (i + 1) + " of 10");
}
updateMessage("End task");
return null;
}
};
}
};
Button btn = new Button("Start Service");
btn.setOnAction(e -> {
ProgressDialog dialog = new ProgressDialog(service);
dialog.setTitle("Progress Dialog");
dialog.setHeaderText("Header message");
Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
stage.getIcons().add(new Image(this.getClass().getResource("<image>.png").toString()));
service.start();
});
Scene scene = new Scene(new StackPane(btn), 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
Faites comme ça:
Alert(AlertType.ERROR, "Erreur de connexion! Verifiez vos Identifiants",FINISH); //Cancel..
setTitle("XNotes FX Erreur");
stage = (Stage) alert.getDialogPane().getScene().getWindow();
stage.getIcons().add(new Image("indiza/XnotesErrorIdz.png")); // To add an icon
showAndWait();
Voici le résultat
** Mes amis, est-ce l'informatique que nous faisons? : Non, nous faisons de l'artisanat **
C’est une méthode que j’inclus dans mes projets JavaFX. Je l'appelle simplement et je passe l'alerte en tant que paramètre pour définir à la fois l'icône de la barre de titre et le graphique d'en-tête.
public class Msg {
public void showInfo(String title, String header, String message) {
Alert alertShowInfo = new Alert(Alert.AlertType.INFORMATION);
addDialogIconTo(alertShowInfo); //add icon and header graphic
alertShowInfo.setTitle(title);
alertShowInfo.setHeaderText(header);
alertShowInfo.setContentText(message);
alertShowInfo.showAndWait();
}
//this adds images to Alert
public void addDialogIconTo(Alert alert) {
// Add custom Image to Dialog's title bar
final Image APPLICATION_ICON = new Image("icon.png");
Stage dialogStage = (Stage) alert.getDialogPane().getScene().getWindow();
dialogStage.getIcons().add(APPLICATION_ICON);
// Add custom ImageView to Dialog's header pane.
final ImageView DIALOG_HEADER_ICON = new ImageView("icon.png");
DIALOG_HEADER_ICON.setFitHeight(48); // Set size to API recommendation.
DIALOG_HEADER_ICON.setFitWidth(48);
alert.getDialogPane().setGraphic(DIALOG_HEADER_ICON);
}
}
Ensuite, quelle que soit la classe dans laquelle je souhaite utiliser l'alerte, une icône et un graphique d'en-tête personnalisés seront déjà disponibles.
public static void main(String[] args){
Msg msg = new Msg();
// Alert will now include custom icon and header graphic.
msg.showInfo("Sucess!", "Program succeeded", "Now exiting program");
}
Vous pouvez facilement utiliser l'icône de votre application pour l'icône d'alerte en définissant votre fenêtre d'application en tant que propriétaire du champ d'alerte:
@FXML
Button buShow;
...
Alert alert = new Alert(AlertType.INFORMATION, "Nice Box.", ButtonType.CLOSE);
alert.initOwner(buShow.getScene().getWindow()); // Alert uses the Windows Icon
alert.show();