I agree that the four showXXX() methods are a slight complexity, but I think
they are simpler than the alternative. They quickly communicate the implied
"Type" of the DialogBox and response:
// Type Message: No response
DialogBox dbox = new DialogBox("FYI"); dbox.setMessage("Just
saying...");
dbox.showMessageDialog(focusedNode);
// Type Confirm: Boolean response
DialogBox dbox = new DialogBox("Sanity Check");
dbox.setMessage("Really???");
boolean response = dbox.showConfirmDialog(focusedNode);
// Type Option: Integer response
DialogBox dbox = new DialogBox("Which One"); dbox.setMessage("Select
One"); dbox.setOptions(myOptions);
int response = dbox.showOptionDialog(focusedNode, defaultOption);
// Type Input: String response
DialogBox dbox = new DialogBox("Tell Me"); dbox.setMessage("Tell me
what you want:");
String response = xbox.showOptionDialog(focusedNode, default);
The only alternative I see would be to explicitly set a DialogBox type and
return a DialogBoxResponse, which could embody any of the above. That seems
cumbersome to me. I also think it would be over-engineering to try to support
any kind of response (say like a Color or a Font). In these cases, I think it's
better to have your ColorChooserPane or FontChooserPane act as content:
// Type ColorChooser: Boolean response plus Color
DialogBox dbox = new DialogBox("Please Pick a Color");
dbox.setContent(myColorChooserPane);
if(dbox.showConfirmPanel(focusedNode))
setColor(myColorChooserPane.getSelectedColor());
In fact, your ColorChooserPane could have a showColorDialog() method that would
just be the above code.
Jeff Martin
On Jun 20, 2014, at 10:15 AM, Stephen F Northover
<[email protected]> wrote:
> This essentially matches my current thinking, however, I would have DialogBox
> as an abstract superclass of Alert. Further, I would not have many different
> types of show() methods.
>
> Want to take the discussion further in the JIRA? That way, is will track
> everyone's thinking on the various issues. The downside is that JIRA does
> not provide threaded conversations and it can be hard to follow.
>
> Steve
>
> On 2014-06-20, 9:41 AM, Jeff Martin wrote:
>> That is a great post. I think the big problem with dialogs in Swing was the
>> permutations problem. There were four basic types of dialogs (Message,
>> Confirm, Option, Input) with six different parameters (Title, Message, Icon,
>> Content, MessageType, Options) - so JOptionPane ended up with a sea of
>> static methods that were confusing to navigate.
>>
>> I don't think you could go wrong with a simple DialogBox class like this (I
>> love simple):
>>
>> // Constructor
>> public DialogBox(String aTitle);
>>
>> // Options
>> public String getTitle();
>> public void setTitle(String aTitle);
>> public String getMessage();
>> public void setMessage(String aMessage);
>> public MessageType getMessageType();
>> public void setMessageType(MessageType aMessageType);
>> public Node getContent();
>> public void setContent(Node aNode);
>> public Node getGraphic();
>> public void setGraphic(Node aNode);
>> public String[] getOptions();
>> public void setOptions(String ... theOptions);
>>
>> // Convenience methods to set Message + MessageType
>> public void setErrorMessage(String aMessage);
>> public void setWarningMessage(String aMessage);
>> public void setQuestionMessage(String aMessage);
>>
>> // Show methods
>> public void showMessageDialog(T aComp);
>> public boolean showConfirmDialog(T aComp);
>> public int showOptionDialog(T aComp, String aDefault);
>> public String showInputDialog(T aComp, String aDefault);
>>
>> // Programatic dismissal
>> public void confirm();
>> public void cancel();
>>
>> Then most common invocations would look something like this:
>>
>> // Get user confirmation
>> DialogBox dbox = new DialogBox("Sanity Check");
>> dbox.setWarningMessage("Are you sure you want to do this? It could kill
>> you.");
>> if(!dbox.showConfirmationDialog(focusedNode)) return;
>>
>> Using instance methods instead of static methods gives opportunity to
>> subclass and override various methods. And notice the Content attribute -
>> for the standard case when no Content is provided, it is built
>> programmatically based on the parameters (essentially just the message and
>> either an Option combo, an input textfield or nothing).
>>
>> I've been using this in my JavaFX app for a while and it is working great
>> and makes porting from Swing easy. I even built it on a convenient
>> FormBuilder class that makes building a simple stack of form controls easy,
>> and can also be used for advanced DialogBoxes.
>>
>> Jeff Martin
>> 214.513.1636
>>
>>
>> On Jun 20, 2014, at 7:05 AM, Stephen F Northover
>> <[email protected]> wrote:
>>
>>> Great post Jonathan. The summary is that whatever direction we take, we'll
>>> have a plan for the future. So if we run out of time and provide only a
>>> very scaled back API, we'll have prototyped how it can evolve to handle
>>> more complex cases.
>>>
>>> Steve
>>>
>>> On 2014-06-20, 12:37 AM, Jonathan Giles wrote:
>>>> Hi all,
>>>>
>>>> Dialogs are something everyone wants, and also something most people seem
>>>> to have an opinion on! JavaFX 8u40 will have dialogs, but what form they
>>>> take (API-wise) is not yet defined. I've posted a relatively long
>>>> discussion on this over at FX Experience [1] and your feedback is highly
>>>> welcome. As I note in the blog post, the Jira issue for this feature is
>>>> RT-12643. If you have any thoughts, please do post them there (rather than
>>>> spam the many good people subscribed to openjfx-dev).
>>>>
>>>> [1] http://fxexperience.com/2014/06/bringing-dialogs-to-javafx/
>>>>
>>>> Thanks!
>>>>
>