<AWT Dev> Problem with modal Dialog

Artem Ananiev Artem.Ananiev at Sun.COM
Mon Feb 16 08:15:52 PST 2009


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 particula 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);
          }

Thanks,

Artem

> /Roman
> 



More information about the awt-dev mailing list