<AWT Dev> Problem with modal Dialog

Roman Kennke roman.kennke at aicas.com
Thu Mar 5 04:43:48 PST 2009


Hi there,

> >>>>>>>> BTW, simply sending this over the EQ is no solution either, because
> >>>>>>>> then
> >>>>>>>> later it will fail to invokeAndWait(). I will think a little more
> >>>>>>>> about
> >>>>>>>> this, or maybe anybody has a quick idea?
> >>>>>>> Just an idea (have not evaluated it carefully):
> >>>>>>> perhaps we should set keepBlockingEDT to false not in
> >>>>>>> hideAndDisposeHandler(),
> >>>>>>> but in WakingRunnable.run() instead.
> >>>>>> I'm looking at this problem at the moment. The problem is the instance
> >>>>>> of WakingRunnable is not run on EDT at all - I don't know why.
> >>>>> I know why. It is because the DisposeAction is run _immediately_, before
> >>>>> the WakingRunnable had a chance. This DisposeAction calls removeNotify(),
> >>>>> which leads to all events on the EQ that are related to the Dialog beeing
> >>>>> discarded.
> >>>> Could you, please, point to the place where all the events are discarded?
> >>>> I don't see any.
> >>> In Component.removeNotify(), we call this:
> >>>
> >>> Toolkit.getEventQueue().removeSourceEvents(this, false);
> >> OK, I see. What a wonderful code...
> >>
> >>> which removes all events related to the component. removeNotify() is
> >>> called from inside the DisposeAction.
> >> For this particular case it's enough to add some additional check to
> >> hideAndDisposeHandler:
> >>
> >>         if (showAppContext != curAppContext) {
> >>             // Wake up event dispatch thread on which the dialog was
> >>             // initially shown
> >>             SunToolkit.postEvent(showAppContext, wakingEvent);
> >>             showAppContext = null;
> >> +        } else if (EventQueue.isDispatchThread()) {
> >> +            waking.run();
> >>         } else {
> >>             Toolkit.getEventQueue().postEvent(wakingEvent);
> >>         }
> > 
> > this change will fix this particular test, but the same problem may
> > exists even when
> > we call hide() not on EDT, it is just a little bit harder to write
> > test for this ;)
> > 
> > What about moving resetting keepBlockingEDT to WakingEvent.run(), or,
> > perhaps, we can simply change
> > target of WakingEvent from a dialog to toolkit.
> > What do you think?
> 
> Setting the target of the WakingEvent to the toolkit sounds like an 
> elegant and efficient solution to me. Simply executing the event 
> directly when on the EDT (as Artem proposed) sounds like crying for more 
> side-effects.

So what should we do about it?

/Roman

-- 
Dipl.-Inform. (FH) Roman Kennke, Software Engineer, http://kennke.org
aicas Allerton Interworks Computer Automated Systems GmbH
Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany
http://www.aicas.com   * Tel: +49-721-663 968-48
USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe
Geschäftsführer: Dr. James J. Hunt





More information about the awt-dev mailing list