<AWT Dev> <Swing Dev> Request for review: 7155298 : Editable TextArea blocks GUI application from exit
Anthony Petrov
anthony.petrov at oracle.com
Tue Mar 27 03:48:27 PDT 2012
Sean, Anton, thanks for clarifications. I'm fine with the fix then.
--
best regards,
Anthony
On 3/27/2012 12:54 PM, Anton V. Tarasov wrote:
> Hi Sean,
>
> On 27.03.2012 7:22, Sean Chou wrote:
>> Hi Anthony,
>>
>> I tried the scenario you suggested, but it doesn't work. And I
>> found the jtreg spec says:
>> ' A "main" action is
>> considered to be finished when the main method returns; if a test involves
>> multiple threads, some synchronization may be necessary to ensure that the
>> other threads finish their work before the thread running the main method
>> returns. '
>> Then I tried to join TimerQueue in main, but it always blocks. So
>> I started a new process
>> to wait instead.
>
> TimerQueue is a package private class which assumes reflection which I
> would avoid using by any means.
>
> I personally don't see any strong reason why you shouldn't use the
> Runtime stuff (taking into account the jtreg behavior). Anthony, do you?
>
>>
>> I tested and found the "/" separated path works on windows, it is
>> not a problem :)
>
> I looked at the implementation of Runtime.exec(String) just for
> curiosity. It (in its deep) normalizes the path via File.getPath(), so
> using slash seems ok.
>
> Thanks,
> Anton.
>
>
>>
>> On Mon, Mar 26, 2012 at 9:55 PM, Anthony Petrov
>> <anthony.petrov at oracle.com <mailto:anthony.petrov at oracle.com>> wrote:
>>
>> Hi Sean,
>>
>> 92 worker =
>> Runtime.getRuntime().exec(System.getProperty("java.home")+"/bin/java
>> TestDispose workprocess");
>>
>>
>> This won't work on MS Windows because the path separator character
>> is different there.
>>
>> Actually, I don't understand why you need this Runtime stuff in
>> the first place. If test JVM doesn't terminate, the test will
>> fail. So why not create a frame and a text field right in the
>> main(), then call dispose() and return from main()? Since the
>> timer thread will still be running, the test's JVM won't exit, and
>> the test will fail by timeout eventually. Will this testing
>> scenario work?
>>
>> --
>> best regards,
>> Anthony
>>
>>
>> On 03/23/12 10:49, Sean Chou wrote:
>>
>>
>> I modified the testcase according to Anthony Petrov's
>> suggestion(http://mail.openjdk.java.net/pipermail/awt-dev/2012-March/002389.html)
>> .
>> The new webrev:
>> http://cr.openjdk.java.net/~zhouyx/7155298/webrev.02/
>> <http://cr.openjdk.java.net/%7Ezhouyx/7155298/webrev.02/>
>>
>> However, the timeout action in jtreg only checks the main
>> method, but
>> the timeout is caused by timer thread .
>> So, I started an other process to run the testcase and the
>> main testcase
>> waitFor that process to stop. In order to kill the process
>> started by
>> the testcase, I added a ShutdownHook to the runtime of main
>> testcase.
>> And added /othervm action to testcase .
>>
>> It seems the testcase is a little over complex, is there any other
>> method to make the testcase simpler ?
>>
>> On Fri, Mar 23, 2012 at 2:04 AM, Oleg Sukhodolsky
>> <son.two at gmail.com <mailto:son.two at gmail.com>
>> <mailto:son.two at gmail.com <mailto:son.two at gmail.com>>> wrote:
>>
>> On Thu, Mar 22, 2012 at 10:50 PM, Anton V. Tarasov
>> <anton.tarasov at oracle.com <mailto:anton.tarasov at oracle.com>
>> <mailto:anton.tarasov at oracle.com
>> <mailto:anton.tarasov at oracle.com>>> wrote:
>> > On 3/22/12 6:15 PM, Oleg Sukhodolsky wrote:
>> >>
>> >> On Thu, Mar 22, 2012 at 5:55 PM, Anton V. Tarasov
>> >> <anton.tarasov at oracle.com
>> <mailto:anton.tarasov at oracle.com>
>> <mailto:anton.tarasov at oracle.com
>> <mailto:anton.tarasov at oracle.com>>> wrote:
>>
>> >>>
>> >>> On 22.03.2012 14:37, Oleg Sukhodolsky wrote:
>> >>>>
>> >>>> On Thu, Mar 22, 2012 at 2:19 PM, Anton V. Tarasov
>> >>>> <anton.tarasov at oracle.com
>> <mailto:anton.tarasov at oracle.com>
>> <mailto:anton.tarasov at oracle.com
>> <mailto:anton.tarasov at oracle.com>>>
>>
>> wrote:
>> >>>>>
>> >>>>> On 22.03.2012 12:47, Oleg Sukhodolsky wrote:
>> >>>>>>
>> >>>>>> On Thu, Mar 22, 2012 at 12:01 PM, Sean
>> Chou<zhouyx at linux.vnet.ibm.com
>> <mailto:zhouyx at linux.vnet.ibm.com>
>> <mailto:zhouyx at linux.vnet.ibm.com
>> <mailto:zhouyx at linux.vnet.ibm.com>>>
>>
>> >>>>>> wrote:
>> >>>>>>>
>> >>>>>>> Hi Oleg,
>> >>>>>>>
>> >>>>>>> Seem there are misunderstanding .
>> >>>>>>> DefaultCaret can receive FocusLostEvent when
>> another
>> control get
>> >>>>>>> focused. But it
>> >>>>>>> doesn't receive FocusLostEvent when disposing.
>> >>>>>>>
>> >>>>>>> The reason is XTextAreaPeer doesn't receive
>> FocusLostEvent when
>> >>>>>>> disposing. But
>> >>>>>>> I don't know if it is a rule that a FocusLostEvent
>> must be
>> sent to
>> >>>>>>> the
>> >>>>>>> focused>>> component when the top-level window
>> is disposed ?
>> >>>>>>
>> >>>>>> Well, for regular AWT component it is expected.
>> And I'd
>> expect that
>> >>>>>> this should also be true for peer.
>> >>>>>
>> >>>>>
>> >>>>> That's right, focus_lost should be dispatched to a
>> disposed focus
>> >>>>> owner.
>> >>>>
>> >>>> So, now we need to figure out why the caret doesn't
>> get the event.
>> >>>>
>> >>>> Oleg.
>> >>>
>> >>>
>> >>> I ran the testcase provided in the webrev and debugged
>> a little.
>> >>> FOCUS_LOST
>> >>> does come to the textarea on its disposal, though when the
>> focus event is
>> >>> being dispatched I see the peer is null.
>> >>> This is quite expected actually. When
>> Component.removeNotify()
>> is called
>> >>> on
>> >>> EDT, it transfers focus further (appropriate focus
>> events get
>> queued) and
>> >>> then nullifies the peer. The events come later.
>> >>> Hope this helps.
>> >>
>> >> Thank you (I do not have Linux, so I can not debug this).
>> >> So, now we know that the cause of the problem is that
>> our internal
>> >> AWTText(Field|Area) may be disposed while they think
>> >> that they are focused, and, at the same time, we can
>> not propogate
>> >> real focus lost to them since peer is desposed
>> >> before we receive the event.
>> >> So, the suggested fix works fine for one particular problem
>> (unstopped
>> >> timer), but we may get some other
>> >> problems due to the cause.
>> >> For me it looks like better fix would be to pass
>> synthetic focus
>> lost
>> >> when we dispose text peer, this way we guarantee
>> >> that life-circle of our synthetic components will be
>> similar to real
>> >> ones and we will meet Swing's expectations.
>> >>
>> >> Does this sounds reasonable?
>> >>
>> >> Regards, Oleg.
>> >
>> >
>> > This sounds reasonable, though I personally don't like
>> the idea
>> of yet
>> > another synthetic focus event...
>>
>> well, (synthetic) focus events are your area of expertise ;)
>>
>> > I actually like the fix Sean suggested (after we see the
>> whole
>> picture).
>> > Otherwise, we may follow your suggestion
>> > to create AWTTextArea.removeNotify(). And even simpler,
>> why not
>> to put
>> > getCaret().setVisible(false) right into
>> JTextComponent.removeNotify()?
>>
>> well, the later is a question for Swing team.
>> The former is reasonable fix (not the best one, but good
>> enough).
>> So, if everyone agree with this approach then I'm fine
>> (hope this is
>> the only problem we
>> will have with invisible focused JTextXXX)
>>
>> Oleg.
>>
>> >
>> > Either of these looks fine to me.
>> >
>> > Thanks,
>> > Anton.
>> >
>> >
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>
More information about the awt-dev
mailing list