Chapter 8, Rendering
#58 Block a Window Without a Modal Dialog
// create the right-click glass pane.
Component rc = new RightClickGlassPane(frame.getContentPane( ),popup);
// set as glasspane and make it visible
// pack and show the frame
While most of this is boilerplate, be sure to notice the call to rc.setVisible().
This is where the glass pane is turned on. If the glass pane is not visible, then
your code won’t ever receive events and work its magic.
This hack only demonstrates intercepting a mouse click, but it could be used
for any other type of event capturing, such as remapping one key to another,
recording mouse events, blocking mouse events
[Hack #58], or creating com-
pletely synthetic events to fool the program.
H A C K
Block a Window Without a Modal Dialog Hack #58
Block the input in a single window during long operations without stopping
your entire application.
Since the dawn of GUIs, most toolkits have had the concept of a modal dia-
log box. This is a small window that restricts input to itself, blocking access
to the rest of the program (or entire operating system in some cases). Modal
windows often produce the desired effect, but sometimes you need a win-
dow that can block itself without blocking access to the whole application.
The most common use for such a window is a long running process, like ren-
dering frames of a movie or waiting for the network to respond. In this case,
you would like to let the user still interact with the rest of the application but
block the one window that represents the work in progress. Swing doesn’t
provide a modal window like this, but since when has that stopped us?
To block a window, you could disable the components within it, but then
you would need to recursively find each component and disable it manu-
ally. This is a big headache, and would make for a very ugly window (all
those grayed-out components). All you really want to do is capture all input
to the window and block that. Swing provides a great way to do this: the
glass pane. The glass pane sits on top of all other components in a window,
making it the perfect place to implement blocking behavior.