<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?

Oleg.

>
> Thanks,
>
> Artem
>
>> /Roman
>>
>



More information about the awt-dev mailing list