package org.peerbox.utils; import java.util.Collection; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Dialog; import javafx.scene.image.Image; import javafx.stage.Stage; import javafx.stage.Window; /** * Utilities for JavaFX dialogs. * * @author albrecht * */ public final class DialogUtils { private DialogUtils() { // prevent instance } /** * Creates an Alert dialog of given alert type. * In addition, the dialog is decorated and configured (icons, ...). * * @param type of the alert * @return alert dialog */ public static Alert createAlert(AlertType type) { Alert dlg = new Alert(type); decorateDialogWithIcon(dlg); if (OsUtils.isLinux()) { /* * FIXME: Due to a bug in JavaFX and Java for linux (glass), the dialogs are not * represented correctly. The size does not increase with the text length and is * cut off if the text is too long (no wrapping). * see the following links: * - https://stackoverflow.com/questions/28937392/javafx-alerts-and-their-size * - https://javafx-jira.kenai.com/browse/RT-40230 * Temporary solution: we make dialogs resizable and set a preferred size on Linux. */ dlg.setResizable(true); dlg.getDialogPane().setPrefSize(420, 280); } return dlg; } /** * Decorates a dialog with window icons. * Note: this may not be required anymore with newer Java versions. * * @param dlg the dialog to decorate */ public static void decorateDialogWithIcon(Dialog<?> dlg) { Window window = dlg.getDialogPane().getScene().getWindow(); if (window instanceof Stage) { Stage stage = (Stage) dlg.getDialogPane().getScene().getWindow(); Collection<Image> icons = IconUtils.createWindowIcons(); stage.getIcons().addAll(icons); } } }