package jfxapp; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.stage.Modality; import javafx.stage.Screen; import javafx.stage.Stage; import java.util.ArrayList; import java.util.List; public final class DialogFX extends Stage { public enum Type { ACCEPT, ERROR, INFO, QUESTION }; private Type type; private Stage stage; private Scene scene; private BorderPane pane = new BorderPane(); private ImageView icon = new ImageView(); private Label message = new Label(); private HBox buttonBox = new HBox(10); private List buttonLabels; private int buttonCancel = -1; private int buttonCount = 0; private int buttonSelected = -1; public DialogFX() { initDialog(Type.INFO); } public void addButtons(List labels) { addButtons(labels, -1, -1); } public void addButtons(List labels, int defaultBtn, int cancelBtn) { buttonLabels = labels; for (int i=0; i() { @Override public void handle(ActionEvent evt) { buttonSelected = buttonLabels.indexOf(((Button) evt.getSource()).getText()); stage.close(); } }); buttonBox.getChildren().add(btn); } buttonBox.setAlignment(Pos.CENTER); BorderPane.setAlignment(buttonBox, Pos.CENTER); BorderPane.setMargin(buttonBox, new Insets(5,5,5,5)); pane.setBottom(buttonBox); buttonCount = labels.size(); } private void addOKButton() { List labels = new ArrayList(1); labels.add("OK"); addButtons(labels, 0, 0); } private void addYesNoButtons() { List labels = new ArrayList(2); labels.add("Ano"); labels.add("Ne"); addButtons(labels); } private void initDialog(Type t) { stage = new Stage(); setType(t); stage.initModality(Modality.APPLICATION_MODAL); stage.setMaxWidth(Screen.getPrimary().getVisualBounds().getWidth() / 2); } private void loadIconFromResource(String fileName) { Image imgIcon = new Image(getClass().getResourceAsStream(fileName)); icon.setPreserveRatio(true); icon.setFitHeight(48); icon.setImage(imgIcon); } public void setMessage(String msg) { message.setText(msg); message.setWrapText(true); message.setFont(Font.font("System", FontWeight.BOLD, 14)); } public void setTitleText(String title) { stage.setTitle(title); } public void setType(Type typeToSet) { type = typeToSet; } private void populateStage() { String iconFile; switch ( type ) { case ACCEPT: iconFile = "/Dialog-accept.jpg"; addOKButton(); break; case ERROR: iconFile = "/Dialog-error.jpg"; addOKButton(); break; case INFO: iconFile = "/Dialog-info.jpg"; addOKButton(); break; case QUESTION: iconFile = "/Dialog-question.jpg"; break; default: iconFile = "/Dialog-info.jpg"; break; } try { loadIconFromResource(iconFile); } catch (Exception ex) { System.err.println("Exception trying to load icon file: " + ex.getMessage()); } BorderPane.setAlignment(icon, Pos.CENTER); BorderPane.setMargin(icon, new Insets(15,15,15,15)); pane.setLeft(icon); BorderPane.setAlignment(message, Pos.CENTER); BorderPane.setMargin(message, new Insets(15,15,15,15)); pane.setCenter(message); pane.styleProperty().set("-fx-background-color: wheat"); scene = new Scene(pane); stage.setScene(scene); } public int showDialog() { populateStage(); if ( type == Type.QUESTION ) { if ( buttonCount == 0 ) { addYesNoButtons(); } } stage.setResizable(false); stage.sizeToScene(); stage.centerOnScreen(); stage.showAndWait(); return ( buttonSelected == -1 ? buttonCancel : buttonSelected ); } }