I'm not sure what the difficulty is. If you set a window to modal, then the event dispatcher can simply not dispatch your events to anything but the modal window. Sure it requires notifying your event dispatcher of the windows modality, but that shouldn't be to tough considering we're writing own dispatcher
Now, what I would do as well is simply have a stack which keeps the modal window list. Each time a modal window is displayed, pop it onto the stack. Before dispatching any events, check the top of the stack. Have a window there? Ok, dispatch to only that window otherwise proceed as normal. Once your modal window is gone, life is back to normal.
Now let's say you have a modal window that opens another modal window (bad design IMHO). The stack simply pops the new modal window on top, giving it priority over the other modal window. Once it's popped off, voila, we're back to our original modal window.
Of course, one could simply say don't implement a stack but simply a pointer as that would enforce by design the rule of only one modal window at a time.
Anyhow, that's how I plan to implement mine.
P.S. I haven't decided on how to implement my focus manager. Although since I have a strict listing of components, I figured that I would simply just transfer down the list. Although that might cause a problem since my render order is determined by the same list. I guess that could cause a problem if you want to render something first but have it come later in the focus chain. Oh well, I'm rambling, the point is I'm still not sure how I'm going to handle the focus stuff.
P.P.S. Upon further reflection the difficulty is in notifying the event manager when a window is shown or hidden, not upon creation. This in itself is not difficult coding wise, but it forces a decision I'm not thrilled about. The only way to do that is by implementing a window listener system, so that the main rendering loop can listen for a window being shown or hidden. As I said, that's not difficult but it's starting to cause a web of triggered events, which IMHO is one of the reasons why Swing is as slow as it is, everything you do ripples down to 10 to 20 events if not more. I can't think of a better way yet, but I'll mull over it and get back to you if I come up with a better solution.