2013-06-11 33 views
0

創建通用確認對話框我測試這個自定義的確認對話框:如何在JavaFX的

public void initConfirmDialog(String confirmMessage) 
    { 

     // Error Dialog Stage init 
     final Stage dialog = new Stage(); 
     // If you want to freeze the background during dialog appearence set Modality.APPLICATION_MODAL 
     // or to allow clicking on the mainstage components set Modality.NONE 
     // and set dialog.showAndWait(); 
     dialog.initModality(Modality.WINDOW_MODAL); 

     // Button "Yes" 
     Button btnYes = new Button("Yes"); 
     Button btnNo = new Button("No"); 

     btnYes.setStyle("-fx-background-color:\n" 
       + "  rgba(0,0,0,0.08),\n" 
       + "  linear-gradient(#9a9a9a, #909090),\n" 
       + "  linear-gradient(white 0%, #f3f3f3 50%, #ececec 51%, #f2f2f2 100%);\n" 
       + " -fx-background-insets: 0 0 -1 0,0,1;\n" 
       + " -fx-background-radius: 4,4,3;\n" 
       + " -fx-padding: 7 36 6 36;\n" 
       + " -fx-text-fill: #242d35;\n" 
       + " -fx-font-size: 13px;"); 

     btnYes.setOnAction(new EventHandler<ActionEvent>() 
     { 
      @Override 
      public void handle(ActionEvent event) 
      { 
       // TODO 
       // call method 
      } 
     }); 

     btnNo.setStyle("-fx-background-color:\n" 
       + "  rgba(0,0,0,0.08),\n" 
       + "  linear-gradient(#9a9a9a, #909090),\n" 
       + "  linear-gradient(white 0%, #f3f3f3 50%, #ececec 51%, #f2f2f2 100%);\n" 
       + " -fx-background-insets: 0 0 -1 0,0,1;\n" 
       + " -fx-background-radius: 4,4,3;\n" 
       + " -fx-padding: 7 36 6 36;\n" 
       + " -fx-text-fill: #242d35;\n" 
       + " -fx-font-size: 13px;"); 

     btnNo.setOnAction(new EventHandler<ActionEvent>() 
     { 
      @Override 
      public void handle(ActionEvent event) 
      { 
       dialog.close();  // Close the dialog 
      } 
     }); 

     // Layout for the Button 
     HBox hbox = new HBox(); 
     hbox.setSpacing(10); 
     hbox.setAlignment(Pos.CENTER); 
     hbox.getChildren().add(btnYes); 
     hbox.getChildren().add(btnNo); 

     // Image 
     ImageView iv = new ImageView(getClass().getResource("/images/dialog-warning.png").toExternalForm()); 

     // Layout for the Label and hBox 
     VBox vbox = new VBox(); 
     vbox.setAlignment(Pos.CENTER); 
     vbox.setSpacing(10); 
     vbox.getChildren().add(iv); 

     // Text 
     Text t = new Text(); 
     t.setText(confirmMessage); 
     t.setFont(Font.font("Verdana", 13)); 

     // Layout for the Button 
     HBox thbox = new HBox(); 
     thbox.setSpacing(10); 
     thbox.setPadding(new Insets(20, 20, 20, 90)); // Place the dialog text right 
     thbox.setAlignment(Pos.CENTER_LEFT); 
     thbox.getChildren().add(t); 

     BorderPane bp = new BorderPane(); 
     bp.setStyle("-fx-background-color: linear-gradient(#ffffff,#f3f3f4);\n" 
       + " -fx-border-width: 1 1 1 1;\n" 
       + " -fx-border-color: #b4b4b4 transparent #b4b4b4 transparent;\n" 
       + " -fx-font-size: 1.083333em;\n" 
       + " -fx-text-fill: #292929;"); 

     bp.setPadding(new Insets(15, 15, 10, 15)); 
     //Button btnTop = new Button("Top"); 
     bp.setTop(null); 
     //Button btnLeft = new Button("Left"); 
     bp.setLeft(vbox); 
     //Button btnCenter = new Button("Center"); 
     bp.setCenter(thbox); 
     //Button btnRight = new Button("Right"); 
     bp.setRight(null); 
     //Button btnBottom = new Button("Bottom"); 
     bp.setBottom(hbox); 

     // Stage 
     Scene scene = new Scene(bp, 500, 140); 
     dialog.setScene(scene); 
     dialog.setTitle("Confirm Dialog"); 
     Image icon = new Image(getClass().getResource("/images/dialog-warning.png").toExternalForm()); 
     dialog.getIcons().add(icon); 
     dialog.show(); 
    } 

我正在尋找一個外行,使這個確認對話框普遍。例如,我將遇到很多情況,我將不得不調用方法來執行某些操作。我無法確認任何情況下的對話。有沒有通用的解決方案?

+0

不能肯定,但認爲DataFx(或JFXtra)配備了便利的對話框? – kleopatra

回答

3

你問的不是一個簡單的任務。我最終編寫了一個相當複雜的類(仍在進行中),它​​正在做很多事情,包括事件的數據輸入,驗證和泛型方法調用。

我附上我當前的代碼,但是:

  1. 它使用MigPane佈局。
  2. 它使用jidefx進行驗證(一些非常醜陋的個人覆蓋,未包括在內)。
  3. 它使用jidefx進行裝飾。
  4. 代碼當然不提供任何形式的擔保。

您可能想要簡化代碼以刪除不需要的依賴關係(我已將註釋掉的驗證內容)。

下面是一些例子: FXDialog examples

注:我從我的東西因特網上發現(版權所有(C)2013年,阿爾文·克里斯Tabontabon)開始,但迄今爲止,幾乎沒有原代碼是左;我只是保留了我喜歡的方面(以及一些.css設置)。

package it.condarelli.javafx.dialog; 

import java.io.File; 
import java.net.MalformedURLException; 

import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Region; 
import javafx.scene.paint.Color; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
//import jidefx.scene.control.decoration.DecorationPane; 
//import jidefx.scene.control.validation.ValidationEvent; 
import net.miginfocom.layout.CC; 
import net.miginfocom.layout.LC; 

import org.tbee.javafx.scene.layout.MigPane; 

import it.condarelli.javafx.css.StyleManager; 
//import it.condarelli.javafx.validation.ValidationUtils; 

public class FXDialog { 

    private ImageView    icon; 
    private Label     lblHeader; 
    private Label     lblMsg; 

    private Button     btnAccept; 
    private Button     btnDecline; 
    private Button     btnCancel; 

    private TextField    inputField; 
    private CheckBox    ckbAction; 

    private MigPane     root; 
    private Response    response; 

    protected Stage     primaryStage; 
    private MigPane     pneButtons; 

    private MigPane     pneCustom; 

    /** 
    * protected enum used to model a user's choice in confirmation dialogs 
    */ 
    protected enum Response { 
     APPROVE(true), DECLINE(false), CANCEL(null); 
     private Boolean val; 

     private Response(Boolean val) { 
      this.val = val; 
     } 

     public Boolean getValue() { 
      return val; 
     } 
    } 

    public enum ButtonSet { 
     DELETE_OPTION(), YES_NO_OPTION(), YES_NO_CANCEL_OPTION(), ACCEPT_DECLINE_OPTION(), OK_OPTION(), OK_CANCEL_OPTION(); 
    } 

    public enum Type { 
     CONFIRMATION, INPUT, MESSAGE, CUSTOM; 
    } 

    public enum Severity { 
     ERROR("error.png", "-fx-background-color: red;"), INFORMATION("information.png", "-fx-background-color: blue;"), WARNING("warning.png", "-fx-background-color: orange;"), QUESTION(
       "question64.png", "-fx-background-color: gold;"); 
     private String ico; 
     private String css; 

     private Severity(String ico, String css) { 
      this.ico = ico; 
      this.css = css; 
     } 

     /** 
     * Returns the textual filename of a specific image file that has to be 
     * displayed as an icon for a certain Severity value 
     * 
     * @return the textual icon-filename 
     */ 
     protected String getIcon() { 
      return ico; 
     } 

     /** 
     * Returns the textual css info for a certain Severity value 
     * 
     * @return the textual icon-filename 
     */ 
     protected String getCss() { 
      return css; 
     } 
    } 

    private double initX; // X-Coordinate location of the dialog 
    private double initY; // Y-Coordinate location of the dialog 

    // inits this object with a modal stage 
    protected FXDialog(Type type, String header, String message) { 
     primaryStage = new Stage(); 
     primaryStage.initModality(Modality.APPLICATION_MODAL); 
     primaryStage.initStyle(StageStyle.TRANSPARENT); 

     MigPane inner = new MigPane(/*"debug"*/); 
     lblHeader = new Label(header); 
     lblHeader.getStyleClass().add("fxdialog-header"); 
     inner.add(lblHeader, "dock north, gaptop 7, gapbottom 5"); 
     icon = new ImageView(/*new Image(FXDialog.class.getResource("icons/question64.png").toExternalForm())*/); 
     inner.add(icon, "dock west, gapright 5"); 
     if (message != null) { 
      lblMsg = new Label(message); 
      lblMsg.getStyleClass().add("fxdialog-message"); 
      inner.add(lblMsg, "wrap"); 
     } 
     switch (type) { 
     case CONFIRMATION: 
      break; 
     case CUSTOM: 
      pneCustom = new MigPane(new LC()/* .debug() */); 
//   inner.add(new DecorationPane(pneCustom)); 
      inner.add(pneCustom); 
      break; 
     case INPUT: 
      pneCustom = new MigPane(new LC()/* .debug() */); 
      inputField = new TextField(); 
      pneCustom.add(inputField); 
      inner.add(pneCustom); 
      break; 
     case MESSAGE: 
      break; 
     } 
     pneButtons = new MigPane(new LC().align("right", "center")); 
     inner.add(pneButtons, "dock south"); 

     DropShadow ds = new DropShadow(); 
     ds.setHeight(25); 
     ds.setRadius(12); 
     ds.setWidth(25); 
     inner.setEffect(ds); 
     inner.getStyleClass().add("fxdialog"); 

     root = new MigPane(); 
     root.getStyleClass().add("fxdialog-root"); 
     //root.setStyle("-fx-background-color: transparent;"); 
     root.add(inner); 
     // root.setStyle("-fx-effect: dropshadow(one-pass-box, #000, 10, 1.0, 0, 0);"); 

     //root.getStylesheets().add(getClass().getResource("FXDialog.css").toExternalForm()); 
     StyleManager.add("FXDialog", getClass().getResource("FXDialog.css").toExternalForm()); 
     StyleManager.register("FXDialog", root); 
     primaryStage.addEventFilter(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent event) { 
       switch (event.getCode()) { 
       case ENTER: 
        if (btnAccept != null) 
         btnAccept.fire(); 
        break; 
       case ESCAPE: 
        if (btnDecline != null) 
         btnDecline.fire(); 
        break; 
       default: 
        // do nothing 
       } 
      } 
     }); 

    } 

    protected void setButtons(ButtonSet buttonSet) { 
     setButtons(buttonSet, null); 
    } 

    protected void setButtons(ButtonSet buttonSet, String cbLabel) { 
     if (buttonSet == null) 
      buttonSet = ButtonSet.OK_OPTION; 
     switch (buttonSet) { 
     case DELETE_OPTION: 
      btnAccept = new Button("Delete"); 
      btnAccept.setPrefWidth(70.0); 
      btnDecline = new Button("Don't Delete"); 
      btnDecline.setDefaultButton(true); 
      btnDecline.requestFocus(); 
      btnDecline.setPrefWidth(80.0); 
      break; 
     case YES_NO_OPTION: 
      btnAccept = new Button("Yes"); 
      btnAccept.setPrefWidth(70.0); 
      btnAccept.setDefaultButton(true); 
      btnAccept.requestFocus(); 
      btnDecline = new Button("No"); 
      btnDecline.setPrefWidth(70.0); 
      break; 
     case OK_CANCEL_OPTION: 
      btnAccept = new Button("Ok"); 
      btnAccept.setPrefWidth(70.0); 
      btnAccept.setDefaultButton(true); 
      btnAccept.requestFocus(); 
      btnDecline = new Button("Cancel"); 
      btnDecline.setPrefWidth(70.0); 
      break; 
     case YES_NO_CANCEL_OPTION: 
      btnAccept = new Button("Yes"); 
      btnAccept.setPrefWidth(70.0); 
      btnAccept.setDefaultButton(true); 
      btnAccept.requestFocus(); 
      btnDecline = new Button("No"); 
      btnDecline.setPrefWidth(70.0); 
      btnCancel = new Button("Cancel"); 
      btnCancel.setPrefWidth(70.0); 
      break; 
     case ACCEPT_DECLINE_OPTION: 
      btnAccept = new Button("Accept"); 
      btnAccept.setPrefWidth(80.0); 
      btnAccept.setDefaultButton(true); 
      btnAccept.requestFocus(); 
      btnDecline = new Button("Decline"); 
      btnDecline.setPrefWidth(80.0); 
      break; 
     case OK_OPTION: 
     default: 
      btnAccept = new Button("Ok"); 
      btnAccept.setPrefWidth(70.0); 
      btnAccept.setDefaultButton(true); 
      btnAccept.requestFocus(); 
     } 
     if (cbLabel != null) { 
      ckbAction = new CheckBox(cbLabel); 
      pneButtons.add(ckbAction, "tag left"); 
     } 
     if (btnCancel != null) { 
      btnCancel.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        setReponse(Response.CANCEL); 
        primaryStage.close(); 
       } 
      }); 
      pneButtons.add(btnCancel, "tag cancel"); 
     } 
     if (btnDecline != null) { 
      btnDecline.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        setReponse(Response.DECLINE); 
        primaryStage.close(); 
       } 
      }); 
      pneButtons.add(btnDecline, "tag no"); 
     } 
     if (btnAccept != null) { 
      btnAccept.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        setReponse(Response.APPROVE); 
        if (cbAction != null && ckbAction.isSelected()) { 
         String value = (inputField != null) ? inputField.getText() : null; 
         rtnObject = cbAction.doit(value); 
        } 

        primaryStage.close(); 
       } 
      }); 
      pneButtons.add(btnAccept, "tag yes"); 
     } 
    } 

    private Boolean open() { 
     Scene scene = new Scene(root, Color.TRANSPARENT); 
     primaryStage.setScene(scene); 
     primaryStage.centerOnScreen(); 

     root.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent me) { 
       initX = me.getScreenX() - primaryStage.getX(); 
       initY = me.getScreenY() - primaryStage.getY(); 
      } 
     }); 

     root.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent me) { 
       primaryStage.setX(me.getScreenX() - initX); 
       primaryStage.setY(me.getScreenY() - initY); 
      } 
     }); 
//  ValidationUtils.initialize(pneCustom); 
     primaryStage.showAndWait(); 
     StyleManager.unregister(root); 
     return response.getValue(); 
    } 

    /** 
    * The purpose of this method is to retain the selected action in the 
    * confirmation dialog. 
    * 
    * @param response 
    */ 
    protected void setReponse(Response response) { 
     this.response = response; 
    } 

    /** 
    * Static method responsible for the displaying of a customizable message 
    * box. 
    * 
    * @param message 
    *   : the actual message to display in the message box 
    * @param title 
    *   : the title of the message dialog 
    * @param messageType 
    *   : available message types are: INFORMATION, WARNING, ERROR, 
    *   each one with its graphical style 
    */ 
    public static void showMessageDialog(String message, String title) { 
     showMessageDialog(message, title, Severity.INFORMATION); 
    } 

    public static void showMessageDialog(String message, String title, Severity severity) { 
     FXDialog dialog = new FXDialog(Type.MESSAGE, title, message); 

     dialog.setKind(severity); 
     dialog.setButtons(ButtonSet.OK_OPTION); 

     dialog.open(); 
    } 

    protected void setKind(Severity severity) { 
     icon.setImage(new Image(FXDialog.class.getResource("icons/" + severity.getIcon()).toExternalForm())); 
     //lblHeader.setStyle(severity.getCss()); 
     for (Severity s : Severity.values()) 
      root.getStyleClass().remove(s.name()); 
     root.getStyleClass().add(severity.name()); 
    } 

    /** 
    * Static method responsible for the displaying of a dialog box with custom 
    * FX content. 
    * 
    * @param content 
    *   : a Region representing the content to be added to the dialog 
    *   stage 
    * @param title 
    *   : the title of the dialog 
    * @param messageType 
    *   : available message types are: INFORMATION, WARNING, ERROR, 
    *   each one with its graphical style 
    * @return 
    */ 
    public static Boolean showCustomDialog(Region content, String title) { 
     return showCustomDialog(content, title, Severity.QUESTION); 
    } 

    public static Boolean showCustomDialog(Region content, String title, Severity severity) { 
     return showCustomDialog(content, title, severity, ButtonSet.ACCEPT_DECLINE_OPTION); 
    } 

    public static Boolean showCustomDialog(Region content, String title, Severity severity, ButtonSet buttonSet) { 
     FXDialog dialog = newCustomDialog(content, title, null, null, severity, buttonSet); 
     return dialog.open(); 
    } 

    private static FXDialog newCustomDialog(Region content, String title, String prompt, Callable<?> action, Severity severity, ButtonSet buttonSet) { 
     final FXDialog dialog = new FXDialog(Type.CUSTOM, title, null); 

     dialog.setKind(severity); 
     dialog.setButtons(buttonSet, prompt); 

     content.styleProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
       if (newValue.contains(";")) 
        dialog.btnAccept.setDisable(true); 
       else 
        dialog.btnAccept.setDisable(false); 
      } 
     }); 

     return dialog; 
    } 

    public static FXDialog newCustomDialog(String title, Severity severity) { 
     final FXDialog dialog = new FXDialog(Type.CUSTOM, title, null); 
     dialog.setKind(severity); 
     return dialog; 
    } 

    private String  cbLabel; 
    private Callable<?> cbAction; 
    private Object  rtnObject; 

    public void addAction(String prompt, Callable<?> action) { 
     cbLabel = prompt; 
     cbAction = action; 
    } 

    public TextField addTextField(String label) { 
     final Label l = new Label(label); 
     TextField tf = new TextField(); 
     tf.setUserData(l); 
     pneCustom.add(l); 
     pneCustom.add(tf, new CC().growX().wrap()); 
     if (inputField == null) 
      inputField = tf; 
     tf.visibleProperty().addListener(new ChangeListener<Boolean>() { 
      @Override 
      public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
       l.setVisible(newValue); 
      } 
     }); 
     return tf; 
    } 

    public CheckBox addCheckBox(String label) { 
     CheckBox cb = new CheckBox(label); 
     pneCustom.add(cb, "wrap"); 
     return cb; 
    } 

    public <T> ComboBox<T> addComboBox(String label, ObservableList<T> items) { 
     Label l = new Label(label); 
     ComboBox<T> cb = new ComboBox<>(items); 
     cb.setUserData(l); 
     pneCustom.add(l); 
     pneCustom.add(cb, new CC().growX().wrap()); 
     return cb; 
    } 

    public Boolean open(ButtonSet buttonSet) { 
     setButtons(buttonSet, cbLabel); 
//  ValidationUtils.addGlobalValidator(pneCustom, ValidationEvent.VALIDATION_INFO, (EventHandler<ValidationEvent>) ev -> { 
//   btnAccept.setDisable(ValidationUtils.compare(ev, ValidationEvent.VALIDATION_INFO) > 0); 
//  }); 
     return open(); 
    } 

    public Object getResult() { 
     return rtnObject; 
    } 

    /** 
    * Static method responsible for the displaying of a confirmation dialog 
    * box, providing a simple binary choice against some question. 
    * 
    * @param caption 
    *   : the text of the question to ask to the user 
    * @param title 
    *   : the title of the confirmation dialog 
    * @param confirmType 
    *   : available confirmation types are: DELETE_OPTION, 
    *   YES_NO_OPTION, ACCEPT_DECLINE_OPTION, each one to set a 
    *   different text for the binary choice buttons that will appear 
    * @return 
    */ 
    public static Boolean showConfirmDialog(String caption, String title, ButtonSet buttonSet) { 
     return showConfirmDialog(caption, title, buttonSet, Severity.QUESTION); 
    } 

    public static Boolean showConfirmDialog(String caption, String title, ButtonSet buttonSet, Severity severity) { 
     FXDialog dialog = new FXDialog(Type.CONFIRMATION, title, caption); 

     dialog.setKind(severity); 
     dialog.setButtons(buttonSet); 

     return dialog.open(); 
    } 

    /** 
    * Static method responsible for the displaying of an input dialog box, 
    * providing an input field to type some (short) text in. 
    * 
    * @param caption 
    *   : the text of the message to display 
    * @param title 
    *   : the title of the input dialog 
    * @return some input text the user typed in 
    */ 
    public static String showInputDialog(String caption, String title) { 
     return showInputDialog(caption, title, ButtonSet.ACCEPT_DECLINE_OPTION, Severity.QUESTION); 
    } 

    public static String showInputDialog(String caption, String title, ButtonSet buttonSet) { 
     return showInputDialog(caption, title, buttonSet, Severity.QUESTION); 
    } 

    public static String showInputDialog(String caption, String title, Severity severity) { 
     return showInputDialog(caption, title, ButtonSet.ACCEPT_DECLINE_OPTION, severity); 
    } 

    public static String showInputDialog(String caption, String title, ButtonSet buttonSet, Severity severity) { 
     FXDialog dialog = new FXDialog(Type.INPUT, title, caption); 

     dialog.setKind(Severity.QUESTION); 
     dialog.setButtons(ButtonSet.ACCEPT_DECLINE_OPTION); 

     dialog.inputField.requestFocus(); 

     return (dialog.open() ? dialog.inputField.getText().trim() : null); 
    } 

    public static abstract class Callable<T> implements java.util.concurrent.Callable<T> { 
     protected String input; 

     private T doit(String input) { 
      this.input = input; 
      try { 
       T t = call(); 
       return t; 
      } catch (Exception e) { 
       throw new IllegalStateException(e.getMessage()); 
      } 
     } 
    } 

    public static Object showExtendedInputDialog(String caption, String title, String prompt, Callable<?> action) { 
     return showExtendedInputDialog(caption, title, prompt, action, ButtonSet.OK_CANCEL_OPTION, Severity.QUESTION); 
    } 

    public static Object showExtendedInputDialog(String caption, String title, String prompt, Callable<?> action, ButtonSet buttonSet) { 
     return showExtendedInputDialog(caption, title, prompt, action, buttonSet, Severity.QUESTION); 
    } 

    public static Object showExtendedInputDialog(String caption, String title, String prompt, Callable<?> action, Severity severity) { 
     return showExtendedInputDialog(caption, title, prompt, action, ButtonSet.OK_CANCEL_OPTION, severity); 
    } 

    public static Object showExtendedInputDialog(String caption, String title, String prompt, Callable<?> action, ButtonSet buttonSet, Severity severity) { 
     FXDialog dialog = new FXDialog(Type.INPUT, title, caption); 

     dialog.setKind(severity); 
     dialog.setButtons(buttonSet, prompt); 

     if (!dialog.open()) 
      return null; 

     String value = dialog.inputField.getText().trim(); 
     if (dialog.ckbAction.isSelected()) { 
      Object o = action.doit(value); 
      if (o != null) 
       return o; 
     } 
     return value; 
    } 

    protected Object userObject; 
    public void setData(Object obj) { 
     userObject = obj; 
    } 
    public Object getData() { 
     return userObject; 
    } 
    public static void setVisible(Node node, boolean b) { 
     node.setVisible(b); 
     Object o = node.getUserData(); 
     if (o instanceof Node) { 
      ((Node) o).setVisible(b); 
     } 
    } 
    // load a custom css File 
    public void loadCSS(File f) { 
     if (f.exists()) { 
      try { 
       root.getStylesheets().add(f.toURI().toURL().toExternalForm()); 
      } catch (MalformedURLException e) { 
      } 
     } 
    } 
} 

這是一個測試程序:

package it.condarelli.javafx.dialog; 

import it.condarelli.javafx.dialog.FXDialog.Callable; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 

import org.tbee.javafx.scene.layout.MigPane; 
//import it.condarelli.javafx.validation.ValidationUtils; 

/** 
* Class used to demonstrate all of the custom dialogs types' behaviour 
* 
* @author Mauro Condarelli 
* 
*/ 
public class TestMain extends Application { 

    /** 
    * Method used to demonstrate the working of MessageDialogs, InputDialogs, 
    * and ConfirmDialogs 
    */ 
    public void start1() { 
     FXDialog.showMessageDialog("This is a demonstration of Information message \ndialog.", "Title (INFORMATION)", FXDialog.Severity.INFORMATION); 
     FXDialog.showMessageDialog("This is a demonstration of Warning message \ndialog.", "Title (WARNING)", FXDialog.Severity.WARNING); 
     FXDialog.showMessageDialog("This is a demonstration of Error message \ndialog.", "Title (ERROR)", FXDialog.Severity.ERROR); 
     String input = FXDialog.showInputDialog("Enter your favorite number:", "Title (INPUT)"); 
     System.out.println(input); 

     boolean confirm = FXDialog.showConfirmDialog("Do you really want to delete the selected item?", "Title (DELETE_OPTION)", FXDialog.ButtonSet.DELETE_OPTION); 
     if (confirm) 
      System.out.println("Accepted!"); 
     else 
      System.out.println("Declined!"); 

     confirm = FXDialog.showConfirmDialog("Do you really want to delete the selected item?", "Title (ACCEPT_DECLINE_OPTION)", FXDialog.ButtonSet.ACCEPT_DECLINE_OPTION); 
     if (confirm) 
      System.out.println("Accepted!"); 
     else 
      System.out.println("Declined!"); 

     confirm = FXDialog.showConfirmDialog("Do you really want to delete the selected item?", "Title (YES_NO_OPTION)", FXDialog.ButtonSet.YES_NO_OPTION); 
     if (confirm) 
      System.out.println("Accepted!"); 
     else 
      System.out.println("Declined!"); 
    } 

    /** 
    * Method used to demonstrate the working of a CustomDialog 
    */ 
    public void start2() { 
     FXDialog fxd; 
     CheckBox cb1, cb2, cb3; 
     TextField tf; 
     ComboBox<String> cb; 
     Boolean res; 

     fxd = FXDialog.newCustomDialog("Dialog Title Here", FXDialog.Severity.WARNING); 
     cb1 = fxd.addCheckBox("Simple checkbox"); 
     cb2 = fxd.addCheckBox("Three state checkbox"); 
     cb2.setAllowIndeterminate(true); 
     cb2.setIndeterminate(false); 
     cb3 = fxd.addCheckBox("Disabled"); 
     cb3.setSelected(true); 
     cb3.setDisable(true); 
     res = fxd.open(null); 
     System.out.println("showCustomDialog returned " + res); 
     System.out.println("showCustomDialog returned " + res + "(" + (cb1.isSelected() ? "X" : " ") + ")"); 

     fxd = FXDialog.newCustomDialog("Dialog Title Here", FXDialog.Severity.WARNING); 
     cb1 = fxd.addCheckBox("Simple checkbox"); 
     cb2 = fxd.addCheckBox("Three state checkbox"); 
     cb2.setAllowIndeterminate(true); 
     cb2.setIndeterminate(false); 
     cb3 = fxd.addCheckBox("Disabled"); 
     cb3.setSelected(true); 
     cb3.setDisable(true); 
     res = fxd.open(FXDialog.ButtonSet.ACCEPT_DECLINE_OPTION); 
     System.out.println("showCustomDialog returned " + res + "(" + (cb1.isSelected() ? "X" : " ") + ")"); 

     fxd = FXDialog.newCustomDialog("Dialog Title Here", FXDialog.Severity.INFORMATION); 
     tf = fxd.addTextField("Name:"); 
//  ValidationUtils.install(tf, ValidationUtils.getDoubleValidator()); 
     cb = fxd.addComboBox("Type:", FXCollections.observableArrayList("pippo", "pluto", "paperino")); 
//  ValidationUtils.install(cb, ValidationUtils.getComboBoxValidator()); 
     res = fxd.open(null); 
     System.out.println("showCustomDialog returned " + res); 
     if (res) { 
      System.out.println(" '" + tf.getText() + "'"); 
      System.out.println(" '" + cb.getValue() + "'"); 
     } 

     fxd = FXDialog.newCustomDialog("Dialog Title Here", FXDialog.Severity.INFORMATION); 
     tf = fxd.addTextField("Name:"); 
//  ValidationUtils.install(tf, ValidationUtils.getIntegerValidator()); 
     cb = fxd.addComboBox("Type:", FXCollections.observableArrayList("pippo", "pluto", "paperino")); 
//  ValidationUtils.install(cb, ValidationUtils.getComboBoxValidator()); 
     fxd.addAction("do it", new Callable<String>() { 
      @Override 
      public String call() throws Exception { 
       System.out.println("handler has been called ("+input+")"); 
       return null; 
      } 
     }); 
     res = fxd.open(FXDialog.ButtonSet.OK_CANCEL_OPTION); 
     System.out.println("showCustomDialog returned " + res); 
     if (res) { 
      System.out.println(" '" + tf.getText() + "'"); 
      System.out.println(" '" + cb.getValue() + "'"); 
     } 
    } 

    /** 
    * Method that adds two buttons to the primary stage, each one dedicated to 
    * launch a demo on some type of custom dialogs. 
    * 
    * @param primaryStage 
    *   : the primary Stage for this Application 
    */ 
    private void init(Stage primaryStage) { 

     MigPane root = new MigPane("wrap 1", "[fill]"); 

     primaryStage.setScene(new Scene(root)); 

     // String insetTextCss = 
     // getClass().getResource("InsetTextButton.css").toExternalForm(); 

     Button b1 = new Button("Some simple Dialogs"); 
     b1.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       start1(); 
      } 
     }); 
     root.add(b1); 
     Button b2 = new Button("Some more complex Dialogs"); 
     b2.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       start2(); 
      } 
     }); 
     root.add(b2); 

    } 

    @Override 
    public void start(Stage primaryStage) { 
     init(primaryStage); 
     primaryStage.show(); 
    } 

    /** 
    * Main function. 
    * 
    * @param args 
    *   : the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

...和accompaining的.css

.fxdialog { 
    -fx-background-color:linear-gradient(white,#DDDDDD); 
    -fx-border-radius: 20; 
    -fx-border-color: transparent; 
    -fx-padding: 10 10 10 10; 
    -fx-background-radius: 20; 
} 
.fxdialog-root { 
    -fx-background-color: transparent; 
} 
.fxdialog-header { 
    -fx-alignment: center; 
    -fx-text-aligment: center; 
    -fx-text-fill: white; 
    -fx-font: 32px bold; 
    -fx-background-color: black; 
    -fx-background-insets: 0 -11 0 -11; 
} 
.ERROR  .fxdialog-header {-fx-background-color: red;} 
.INFORMATION .fxdialog-header {-fx-background-color: blue;} 
.WARNING  .fxdialog-header {-fx-background-color: orange;} 
.QUESTION .fxdialog-header {-fx-background-color: gold;} 
.fxdialog-message { 
    -fx-font-size: 18px; 
} 
.button { 
    -fx-font-size: 12px; 
} 
.combo-box .list-view .list-cell { 
    -fx-background-color: rgba(33, 248, 33, .4); 
    -fx-accent: derive(-fx-control-inner-background, -40%); 
} 
.combo-box .list-view .list-cell:busy { 
    -fx-graphic: url("icons/link.png"); 
    -fx-background-color: rgba(255, 248, 33, .4); 
    -fx-accent: derive(-fx-control-inner-background, -40%); 
} 
+0

你能在這裏粘貼最後的結果嗎? –

+0

@Peter Penzov:我更新了答案。 – ZioByte

+0

@Peter Penzov where es it.condarelli.javafx?來源不完整 – Doberon

1

ButtononActionProperty(),所以如果你有按鈕訪問你的按鈕,你可以設置這個屬性來定義你想要執行的動作,當用戶點擊它。

button.onActionProperty().set(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent actionEvent) { 
      //Here your action 
     } 
    }); 

所以,如果你給訪問您的按鈕onactionproperty你可以定義easely有行動

+0

如果我正確理解你,我必須將我想調用的對象的Java方法發送到'onActionProperty()'? –

+0

例如在想要使用彈出窗口的類中,要配置它,您可以執行諸如popup.getButton.onActionProperty()。set(yourEventHandler)之類的操作,當您調用彈出窗口時,該按鈕將對yourEventHandler作出反應 –