Class Dialog<R>

  • Type Parameters:
    R - The return type of the dialog, via the result property.
    All Implemented Interfaces:
    EventTarget
    Direct Known Subclasses:
    Alert, ChoiceDialog, TextInputDialog

    public class Dialog<R>
    extends Object
    implements EventTarget
    A Dialog in JavaFX wraps a DialogPane and provides the necessary API to present it to end users. In JavaFX 8u40, this essentially means that the DialogPane is shown to users inside a Stage, but future releases may offer alternative options (such as 'lightweight' or 'internal' dialogs). This API therefore is intentionally ignorant of the underlying implementation, and attempts to present a common API for all possible implementations.

    The Dialog class has a single generic type, R, which is used to represent the type of the result property (and also, how to convert from ButtonType to R, through the use of the result converter Callback).

    Critical note: It is critical that all developers who choose to create their own dialogs by extending the Dialog class understand the importance of the result converter property. A result converter must always be set, whenever the R type is not Void or ButtonType. If this is not heeded, developers will find that they get ClassCastExceptions in their code, for failure to convert from ButtonType via the result converter.

    It is likely that most developers would be better served using either the Alert class (for pre-defined, notification-style alerts), or either of the two pre-built dialogs (TextInputDialog and ChoiceDialog), depending on their needs.

    Once a Dialog is instantiated, the next step is to configure it. Almost all properties on Dialog are not related to the content of the Dialog, the only exceptions are contentTextProperty(), headerTextProperty(), and graphicProperty(), and these properties are simply forwarding API onto the respective properties on the DialogPane stored in the dialog pane property. These three properties are forwarded from DialogPane for developer convenience. For developers wanting to configure their dialog, they will in many cases be required to use code along the lines of dialog.getDialogPane().setExpandableContent(node).

    After configuring these properties, all that remains is to consider whether the buttons (created using ButtonType and the DialogPane.createButton(ButtonType) method) are fully configured. Developers will quickly find that the amount of configurability offered via the ButtonType class is minimal. This is intentional, but does not mean that developers can not modify the buttons created by the ButtonType that have been specified. To do this, developers simply call the DialogPane.lookupButton(ButtonType) method with the ButtonType (assuming it has already been set in the DialogPane.getButtonTypes() list. The returned Node is typically of type Button, but this depends on if the DialogPane.createButton(ButtonType) method has been overridden. A typical approach is therefore along the following lines:

    
         ButtonType loginButtonType = new ButtonType("Login", ButtonData.OK_DONE);
         Dialog<String> dialog = new Dialog<>();
         dialog.getDialogPane().getButtonTypes().add(loginButtonType);
         boolean disabled = false; // computed based on content of text fields, for example
         dialog.getDialogPane().lookupButton(loginButtonType).setDisable(disabled);

    Once a Dialog is instantiated and fully configured, the next step is to show it. More often than not, dialogs are shown in a modal and blocking fashion. 'Modal' means that the dialog prevents user interaction with the owning application whilst it is showing, and 'blocking' means that code execution stops at the point in which the dialog is shown. This means that you can show a dialog, await the user response, and then continue running the code that directly follows the show call, giving developers the ability to immediately deal with the user input from the dialog (if relevant).

    JavaFX dialogs are modal by default (you can change this via the initModality(javafx.stage.Modality) API). To specify whether you want blocking or non-blocking dialogs, developers simply choose to call showAndWait() or show() (respectively). By default most developers should choose to use showAndWait(), given the ease of coding in these situations. Shown below is three code snippets, showing three equally valid ways of showing a dialog:

    Option 1: The 'traditional' approach

    
     Optional<ButtonType> result = dialog.showAndWait();
     if (result.isPresent() && result.get() == ButtonType.OK) {
         formatSystem();
     }

    Option 2: The traditional + Optional approach

    
     dialog.showAndWait().ifPresent(response -> {
         if (response == ButtonType.OK) {
             formatSystem();
         }
     });

    Option 3: The fully lambda approach

    
     dialog.showAndWait()
          .filter(response -> response == ButtonType.OK)
          .ifPresent(response -> formatSystem());

    There is no better or worse option of the three listed above, so developers are encouraged to work to their own style preferences. The purpose of showing the above is to help introduce developers to the Optional API, which is new in Java 8 and may be foreign to many developers.

    Dialog Validation / Intercepting Button Actions

    In some circumstances it is desirable to prevent a dialog from closing until some aspect of the dialog becomes internally consistent (e.g. a form inside the dialog has all fields in a valid state). To do this, users of the dialogs API should become familiar with the DialogPane.lookupButton(ButtonType) method. By passing in a ButtonType (that has already been set in the button types list), users will be returned a Node that is typically of type Button (but this depends on if the DialogPane.createButton(ButtonType) method has been overridden). With this button, users may add an event filter that is called before the button does its usual event handling, and as such users may prevent the event handling by consuming the event. Here's a simplified example:

    final Button btOk = (Button) dlg.getDialogPane().lookupButton(ButtonType.OK);
     btOk.addEventFilter(ActionEvent.ACTION, event -> {
         if (!validateAndStore()) {
             event.consume();
         }
     });

    Dialog Closing Rules

    It is important to understand what happens when a Dialog is closed, and also how a Dialog can be closed, especially in abnormal closing situations (such as when the 'X' button is clicked in a dialogs title bar, or when operating system specific keyboard shortcuts (such as alt-F4 on Windows) are entered). Fortunately, the outcome is well-defined in these situations, and can be best summarised in the following bullet points:

    • JavaFX dialogs can only be closed 'abnormally' (as defined above) in two situations:
      1. When the dialog only has one button, or
      2. When the dialog has multiple buttons, as long as one of them meets one of the following requirements:
        1. The button has a ButtonType whose ButtonBar.ButtonData is of type ButtonBar.ButtonData.CANCEL_CLOSE.
        2. The button has a ButtonType whose ButtonBar.ButtonData returns true when ButtonBar.ButtonData.isCancelButton() is called.
    • In all other situations, the dialog will refuse to respond to all close requests, remaining open until the user clicks on one of the available buttons in the DialogPane area of the dialog.
    • If a dialog is closed abnormally, and if the dialog contains a button which meets one of the two criteria above, the dialog will attempt to set the result property to whatever value is returned from calling the result converter with the first matching ButtonType.
    • If for any reason the result converter returns null, or if the dialog is closed when only one non-cancel button is present, the result property will be null, and the showAndWait() method will return Optional.empty(). This later point means that, if you use either of option 2 or option 3 (as presented earlier in this class documentation), the Optional.ifPresent(java.util.function.Consumer) lambda will never be called, and code will continue executing as if the dialog had not returned any value at all.
    Since:
    JavaFX 8u40
    See Also:
    Alert, TextInputDialog, ChoiceDialog
    • Constructor Detail

      • Dialog

        public Dialog()
        Creates a dialog without a specified owner.
    • Method Detail

      • show

        public final void show()
        Shows the dialog but does not wait for a user response (in other words, this brings up a non-blocking dialog). Users of this API must either poll the result property, or else add a listener to the result property to be informed of when it is set.
        Throws:
        IllegalStateException - if this method is called on a thread other than the JavaFX Application Thread.
      • showAndWait

        public final Optional<R> showAndWait()
        Shows the dialog and waits for the user response (in other words, brings up a blocking dialog, with the returned value the users input).

        This method must be called on the JavaFX Application thread. Additionally, it must either be called from an input event handler or from the run method of a Runnable passed to Platform.runLater. It must not be called during animation or layout processing.

        Returns:
        An Optional that contains the result. Refer to the Dialog class documentation for more detail.
        Throws:
        IllegalStateException - if this method is called on a thread other than the JavaFX Application Thread.
        IllegalStateException - if this method is called during animation or layout processing.
      • close

        public final void close()
        Closes this Dialog. This call is equivalent to hide().
      • hide

        public final void hide()
        Hides this Dialog.
      • initModality

        public final void initModality​(Modality modality)
        Specifies the modality for this dialog. This must be done prior to making the dialog visible. The modality is one of: Modality.NONE, Modality.WINDOW_MODAL, or Modality.APPLICATION_MODAL.
        Default value:
        Modality.APPLICATION_MODAL
        Parameters:
        modality - the modality for this dialog.
        Throws:
        IllegalStateException - if this property is set after the dialog has ever been made visible.
      • getModality

        public final Modality getModality()
        Retrieves the modality attribute for this dialog.
        Returns:
        the modality.
      • initStyle

        public final void initStyle​(StageStyle style)
        Specifies the style for this dialog. This must be done prior to making the dialog visible. The style is one of: StageStyle.DECORATED, StageStyle.UNDECORATED, StageStyle.TRANSPARENT, StageStyle.UTILITY, or StageStyle.UNIFIED.
        Default value:
        StageStyle.DECORATED
        Parameters:
        style - the style for this dialog.
        Throws:
        IllegalStateException - if this property is set after the dialog has ever been made visible.
      • initOwner

        public final void initOwner​(Window window)
        Specifies the owner Window for this dialog, or null for a top-level, unowned dialog. This must be done prior to making the dialog visible.
        Default value:
        null
        Parameters:
        window - the owner Window for this dialog.
        Throws:
        IllegalStateException - if this property is set after the dialog has ever been made visible.
      • getOwner

        public final Window getOwner()
        Retrieves the owner Window for this dialog, or null for an unowned dialog.
        Returns:
        the owner Window.
      • getDialogPane

        public final DialogPane getDialogPane()
        Gets the value of the property dialogPane.
        Property description:
        The root node of the dialog, the DialogPane contains all visual elements shown in the dialog. As such, it is possible to completely adjust the display of the dialog by modifying the existing dialog pane or creating a new one.
      • setDialogPane

        public final void setDialogPane​(DialogPane value)
        Sets the value of the property dialogPane.
        Property description:
        The root node of the dialog, the DialogPane contains all visual elements shown in the dialog. As such, it is possible to completely adjust the display of the dialog by modifying the existing dialog pane or creating a new one.
      • contentTextProperty

        public final StringProperty contentTextProperty()
        A property representing the content text for the dialog pane. The content text is lower precedence than the content node, meaning that if both the content node and the contentText properties are set, the content text will not be displayed in a default DialogPane instance.
        See Also:
        getContentText(), setContentText(String)
      • getContentText

        public final String getContentText()
        Returns the currently-set content text for this DialogPane.
        Returns:
        the currently-set content text for this DialogPane
      • setContentText

        public final void setContentText​(String contentText)
        Sets the string to show in the dialog content area. Note that the content text is lower precedence than the content node, meaning that if both the content node and the contentText properties are set, the content text will not be displayed in a default DialogPane instance.
        Parameters:
        contentText - the string to show in the dialog content area
      • headerTextProperty

        public final StringProperty headerTextProperty()
        A property representing the header text for the dialog pane. The header text is lower precedence than the header node, meaning that if both the header node and the headerText properties are set, the header text will not be displayed in a default DialogPane instance.
        See Also:
        getHeaderText(), setHeaderText(String)
      • getHeaderText

        public final String getHeaderText()
        Returns the currently-set header text for this DialogPane.
        Returns:
        the currently-set header text for this DialogPane
      • setHeaderText

        public final void setHeaderText​(String headerText)
        Sets the string to show in the dialog header area. Note that the header text is lower precedence than the header node, meaning that if both the header node and the headerText properties are set, the header text will not be displayed in a default DialogPane instance.
        Parameters:
        headerText - the string to show in the dialog header area
      • getGraphic

        public final Node getGraphic()
        Gets the value of the property graphic.
        Property description:
        The dialog graphic, presented either in the header, if one is showing, or to the left of the content.
      • setGraphic

        public final void setGraphic​(Node graphic)
        Sets the dialog graphic, which will be displayed either in the header, if one is showing, or to the left of the content.
        Parameters:
        graphic - The new dialog graphic, or null if no graphic should be shown.
      • resultProperty

        public final ObjectProperty<R> resultProperty()
        A property representing what has been returned from the dialog. A result is generated through the result converter, which is intended to convert from the ButtonType that the user clicked on into a value of type R. Refer to the Dialog class JavaDoc for more details.
        See Also:
        getResult(), setResult(R)
      • getResult

        public final R getResult()
        Gets the value of the property result.
        Property description:
        A property representing what has been returned from the dialog. A result is generated through the result converter, which is intended to convert from the ButtonType that the user clicked on into a value of type R. Refer to the Dialog class JavaDoc for more details.
      • setResult

        public final void setResult​(R value)
        Sets the value of the property result.
        Property description:
        A property representing what has been returned from the dialog. A result is generated through the result converter, which is intended to convert from the ButtonType that the user clicked on into a value of type R. Refer to the Dialog class JavaDoc for more details.
      • resultConverterProperty

        public final ObjectProperty<Callback<ButtonType,​R>> resultConverterProperty()
        API to convert the ButtonType that the user clicked on into a result that can be returned via the result property. This is necessary as ButtonType represents the visual button within the dialog, and do not know how to map themselves to a valid result - that is a requirement of the dialog implementation by making use of the result converter. In some cases, the result type of a Dialog subclass is ButtonType (which means that the result converter can be null), but in some cases (where the result type, R, is not ButtonType or Void), this callback must be specified.
        See Also:
        getResultConverter(), setResultConverter(Callback)
      • getResultConverter

        public final Callback<ButtonType,​R> getResultConverter()
        Gets the value of the property resultConverter.
        Property description:
        API to convert the ButtonType that the user clicked on into a result that can be returned via the result property. This is necessary as ButtonType represents the visual button within the dialog, and do not know how to map themselves to a valid result - that is a requirement of the dialog implementation by making use of the result converter. In some cases, the result type of a Dialog subclass is ButtonType (which means that the result converter can be null), but in some cases (where the result type, R, is not ButtonType or Void), this callback must be specified.
      • setResultConverter

        public final void setResultConverter​(Callback<ButtonType,​R> value)
        Sets the value of the property resultConverter.
        Property description:
        API to convert the ButtonType that the user clicked on into a result that can be returned via the result property. This is necessary as ButtonType represents the visual button within the dialog, and do not know how to map themselves to a valid result - that is a requirement of the dialog implementation by making use of the result converter. In some cases, the result type of a Dialog subclass is ButtonType (which means that the result converter can be null), but in some cases (where the result type, R, is not ButtonType or Void), this callback must be specified.
      • isShowing

        public final boolean isShowing()
        Returns whether or not the dialog is showing.
        Returns:
        true if dialog is showing.
      • isResizable

        public final boolean isResizable()
        Returns whether or not the dialog is resizable.
        Returns:
        true if dialog is resizable.
      • setResizable

        public final void setResizable​(boolean resizable)
        Sets whether the dialog can be resized by the user. Resizable dialogs can also be maximized ( maximize button becomes visible)
        Parameters:
        resizable - true if dialog should be resizable.
      • getWidth

        public final double getWidth()
        Returns the width of the dialog.
        Returns:
        the width of the dialog
      • setWidth

        public final void setWidth​(double width)
        Sets the width of the dialog.
        Parameters:
        width - the width of the dialog
      • getHeight

        public final double getHeight()
        Returns the height of the dialog.
        Returns:
        the height of the dialog
      • setHeight

        public final void setHeight​(double height)
        Sets the height of the dialog.
        Parameters:
        height - the height of the dialog
      • getTitle

        public final String getTitle()
        Return the title of the dialog.
        Returns:
        the title of the dialog
      • setTitle

        public final void setTitle​(String title)
        Change the Title of the dialog.
        Parameters:
        title - the Title of the dialog
      • getX

        public final double getX()
        Gets the value of the property x.
        Property description:
        The horizontal location of this Dialog. Changing this attribute will move the Dialog horizontally.
      • setX

        public final void setX​(double x)
        Sets the value of the property x.
        Property description:
        The horizontal location of this Dialog. Changing this attribute will move the Dialog horizontally.
      • getY

        public final double getY()
        Gets the value of the property y.
        Property description:
        The vertical location of this Dialog. Changing this attribute will move the Dialog vertically.
      • setY

        public final void setY​(double y)
        Sets the value of the property y.
        Property description:
        The vertical location of this Dialog. Changing this attribute will move the Dialog vertically.
      • buildEventDispatchChain

        public EventDispatchChain buildEventDispatchChain​(EventDispatchChain tail)
        Construct an event dispatch chain for this target. The event dispatch chain contains event dispatchers which might be interested in processing of events targeted at this EventTarget. This event target is not automatically added to the chain, so if it wants to process events, it needs to add an EventDispatcher for itself to the chain.

        In the case the event target is part of some hierarchy, the chain for it is usually built from event dispatchers collected from the root of the hierarchy to the event target.

        The event dispatch chain is constructed by modifications to the provided initial event dispatch chain. The returned chain should have the initial chain at its end so the dispatchers should be prepended to the initial chain.

        The caller shouldn't assume that the initial chain remains unchanged nor that the returned value will reference a different chain.

        Specified by:
        buildEventDispatchChain in interface EventTarget
        Parameters:
        tail - the initial chain to build from
        Returns:
        the resulting event dispatch chain for this target
      • setOnShowing

        public final void setOnShowing​(EventHandler<DialogEvent> value)
        Sets the value of the property onShowing.
        Property description:
        Called just prior to the Dialog being shown.
      • getOnShowing

        public final EventHandler<DialogEvent> getOnShowing()
        Gets the value of the property onShowing.
        Property description:
        Called just prior to the Dialog being shown.
      • setOnShown

        public final void setOnShown​(EventHandler<DialogEvent> value)
        Sets the value of the property onShown.
        Property description:
        Called just after the Dialog is shown.
      • getOnShown

        public final EventHandler<DialogEvent> getOnShown()
        Gets the value of the property onShown.
        Property description:
        Called just after the Dialog is shown.
      • setOnHiding

        public final void setOnHiding​(EventHandler<DialogEvent> value)
        Sets the value of the property onHiding.
        Property description:
        Called just prior to the Dialog being hidden.
      • getOnHiding

        public final EventHandler<DialogEvent> getOnHiding()
        Gets the value of the property onHiding.
        Property description:
        Called just prior to the Dialog being hidden.
      • setOnHidden

        public final void setOnHidden​(EventHandler<DialogEvent> value)
        Sets the value of the property onHidden.
        Property description:
        Called just after the Dialog has been hidden. When the Dialog is hidden, this event handler is invoked allowing the developer to clean up resources or perform other tasks when the Alert is closed.
      • getOnHidden

        public final EventHandler<DialogEvent> getOnHidden()
        Gets the value of the property onHidden.
        Property description:
        Called just after the Dialog has been hidden. When the Dialog is hidden, this event handler is invoked allowing the developer to clean up resources or perform other tasks when the Alert is closed.
      • setOnCloseRequest

        public final void setOnCloseRequest​(EventHandler<DialogEvent> value)
        Sets the value of the property onCloseRequest.
        Property description:
        Called when there is an external request to close this Dialog. The installed event handler can prevent dialog closing by consuming the received event.
      • getOnCloseRequest

        public final EventHandler<DialogEvent> getOnCloseRequest()
        Gets the value of the property onCloseRequest.
        Property description:
        Called when there is an external request to close this Dialog. The installed event handler can prevent dialog closing by consuming the received event.