I’m a GWT and Java newbie trying to figure out how to create a synchronous (modal) dialog in GWT, but I’m having difficulty. The DialogBox class has a flag that says:
modal – true if keyboard and mouse events for widgets not contained by the dialog should be ignored
But that doesn’t make the dialog synchronous.
I read one suggestion that said that I need to place the code that processes the dialog’s data entered by the user inside the OK button handler. I don’t like that because it makes the dialog responsible for displaying the data and processing it too. This results in a poor “Separation of Concerns” and violates the “Single Responsibility Principle” of good design.
I placed the code I want to execute in the OK button handler and now want to have my GWT dialog used in two places in my code. In one case, the user’s data from the dialog is added to a table when the OK button is pressed. In the other case, the data in the table is modified when the OK button is pressed. If I could create a truly synchronous dialog, I could handle the OK button outside the dialog when it returns from execution and easily reused the dialog.
If forced to use my current asynchronous model, I’ll need to pass in additional data as described here. This seems like a lot of work for such a common task. Did I miss something? Are there other options?
The modal flag basically makes the dialog take the focus of the UI. So nothing else can be clicked or interacted with except for what is in the dialog.
Unfortunately as you’ll know, JavaScript (GWT) is inherently asynchronous – in the browser there is no JS code executing until the user does something to trigger an event. So it is events we have to respond to.
As far as I am aware GWT does not provide a synchronous dialog. If it did, it would mean that a blocking section of code is introduced. With JavaScript being single threaded, that would lock up your application in busy waiting – meaning that you couldn’t do any meaningful processing in the dialog itself or anywhere else for that matter.
This is how I would handle it:
This is very similar to the function pointer link you had mentioned – you’d just be writing your own event.