<AWT Dev> Problem with modal Dialog

Oleg Sukhodolsky son.two at gmail.com
Mon Feb 16 11:15:53 PST 2009

Hi Artem,

On Mon, Feb 16, 2009 at 7:15 PM, Artem Ananiev <Artem.Ananiev at sun.com> wrote:
> Roman Kennke wrote:
>> Hi Artem,
>>>>>>> Hrmpf. Seems I cannot. The disclaimer says 'During the initial
>>>>>>> rollout
>>>>>>> phase, this site will only be accepting and tracking patch
>>>>>>> contributions
>>>>>>> from developers without push access to the OpenJDK 6 and 7 forests.'
>>>>>>> and
>>>>>>>  since I _have_ push access, I can't file bug reports. Too bad.
>>>>>>> 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?


> Thanks,
> Artem
>> /Roman

More information about the awt-dev mailing list