<AWT Dev> Problem with modal Dialog

Artem Ananiev Artem.Ananiev at Sun.COM
Thu Mar 19 02:27:44 PDT 2009


Roman Kennke wrote:
> 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?

I'm fine with changing event's target to Toolkit. Could you send a patch 
for review then?

Thanks,

Artem

> /Roman
> 



More information about the awt-dev mailing list