Some time back, I was searching for basic dialog functionality within JavaFX and came up empty. After finding a decent open-source offering on GitHub that almost fit the bill, I began using it...and immediately began thinking of ways to "do it differently." :-) Having a weekend to kill, I ended up creating DialogFX and releasing it on GitHub (hecklerm/DialogFX) for anyone who might find it useful. Shortly thereafter, it was incorporated into JFXtras (jfxtras.org) as well.
Today I'm sharing a different, more flexible and capable JavaFX dialog called MonologFX that I've been developing and refining over the past few months. The summary of its progression thus far is pretty well captured in the README.md file I posted with the project on GitHub:
After creating the DialogFX library for JavaFX, I received several suggestions and requests for additional or different functionality, some of which ran counter to the interfaces and/or intent of the DialogFX "way of doing things". Great ideas, but not completely compatible with the existing functionality. Wanting to incorporate these capabilities, I started over...incorporating some parts of DialogFX into the new MonologFX, as I called it, but taking it in a different direction when it seemed sensible to do so.
In the meantime, the OpenJFX team has released dialog code that will be refined and eventually incorporated into JavaFX and OpenJFX. Rather than just scrap the MonologFX code or hoard it, I'm releasing it here on GitHub with the hope that someone may find it useful, interesting, or entertaining. You may never need it, but regardless, MonologFX is there for the taking.
Things of Note
So, what are some features of MonologFX?
Four kinds of dialog boxes: ACCEPT (check mark icon), ERROR (red 'x'), INFO (blue "i"), and QUESTION (blue question mark)
Button alignment configurable by developer: LEFT, RIGHT, or CENTER
Skins/stylesheets support
Shortcut key/mnemonics support (Alt-<key>)
Ability to designate default (RETURN-key) and cancel (ESCAPE-key) buttons
Built-in button types and labels for OK, CANCEL, ABORT, RETRY, IGNORE, YES, and NO
Custom button types: CUSTOM1, CUSTOM2, CUSTOM3
Internationalization (i18n) built in. Currently, files are provided for English/US and Spanish/Spain locales; please share others and I'll add them!
Icon support for your buttons, with or without text labels
Fully Free/Libre Open Source Software (FLOSS), with latest source code & .jar always available at GitHub
Quick Usage Overview
Having an intense distaste for rough edges and gears flying when things break (!), I've tried to provide defaults for everything and "fail-safes" to avoid messy outcomes if some property isn't specified, etc. This also feeds the goal of making MonologFX as easy to use as possible, while retaining the library's full flexibility. Or at least that's the plan. :-)
You can hand-assemble your buttons and dialogs, but I've also included Builder classes to help move that along as well. Here are a couple examples:
MonologFXButton mlb = MonologFXButtonBuilder.create() .defaultButton(true) .icon(new ImageView(new Image(getClass().getResourceAsStream("dialog_apply.png")))) .type(MonologFXButton.Type.OK) .build();
MonologFXButton mlb2 = MonologFXButtonBuilder.create() .cancelButton(true) .icon(new ImageView(new Image(getClass().getResourceAsStream("dialog_cancel.png")))) .type(MonologFXButton.Type.CANCEL) .build();
MonologFX mono = MonologFXBuilder.create() .modal(true) .message("Welcome to MonologFX! Please feel free to try it out and share your thoughts.") .titleText("Important Announcement") .button(mlb) .button(mlb2) .buttonAlignment(MonologFX.ButtonAlignment.CENTER) .build();
MonologFXButton.Type retval = mono.showDialog();
MonologFXButton mlb = MonologFXButtonBuilder.create() .defaultButton(true) .icon(new ImageView(new Image(getClass().getResourceAsStream("dialog_apply.png")))) .type(MonologFXButton.Type.YES) .build();
MonologFXButton mlb2 = MonologFXButtonBuilder.create() .cancelButton(true) .icon(new ImageView(new Image(getClass().getResourceAsStream("dialog_cancel.png")))) .type(MonologFXButton.Type.NO) .build();
MonologFX mono = MonologFXBuilder.create() .modal(true) .type(MonologFX.Type.QUESTION) .message("Welcome to MonologFX! Does this look like it might be useful?") .titleText("Important Announcement") .button(mlb) .button(mlb2) .buttonAlignment(MonologFX.ButtonAlignment.RIGHT) .build();
Extra Credit
Thanks to everyone who offered ideas for improvement and/or extension to the functionality contained within DialogFX. The JFXtras team welcomed it into the fold, and while I doubt there will be a need to include MonologFX in JFXtras, team members Gerrit Grunwald & Jose Peredas Llamas volunteered templates and i18n expertise to make MonologFX what it is. Thanks for the push, guys!
Where to Get (Git!) It
If you'd like to check it out, point your browser to the MonologFX repository on GitHub. Full source code is there, along with the current .jar file. Please give it a try and share your thoughts! I'd love to hear from you.
All the best,Mark