<Swing Dev> DnD fails with JTextArea and JTextField
Pavel Porvatov
pavel.porvatov at oracle.com
Thu Sep 29 09:56:09 UTC 2011
Hi Sean,
> Hi Pavel,
>
> Is toolkit.realSync() doing the job of "sleep 10s and throw an
> timeout exception" ?
Artem has explained that.
> I found the main thread exit after realSynch is invoked. Should I
> catch that exception?
No, any unexpected exception should be considered as a test failing.
> I can not validate the testcase after I changed to use realSynch,
> it always fails with throwing an exception.
> Testcase test\javax\swing\JSlider\6848475\bug6848475.java fails
> on my machine with timeoutexception as
> well.
It looks strange. Did you invoked realSync from non-EDT thread? Which
version of jtreg do you use? Can you try jtreg on another machine?
Regards, Pavel
> bug6848475.java seems not catching it.
>
>
> 2011/9/26 Pavel Porvatov <pavel.porvatov at oracle.com
> <mailto:pavel.porvatov at oracle.com>>
>
> Hi Sean,
>> Hi Pavel,
>>
>> Thanks for new comments. I was looking
>> at test\javax\swing\JTextArea\6940863
>> and copied the copyright from there, and just put the
>> initialization part of the swing
>> code into EDT. I didn't find realSynch in Toolkit class so used
>> synch. I'll modify
>> that.
> The realSync is a SunToolkit method.
>
>> About the first comment, do you mean to put the testcase and
>> the fix together
>> in a webrev ?
> Yep! It's hard to reconstruct fix from different mails. Don't
> forget to select an appropriate folder for the test...
>
> Thanks, Pavel
>
>>
>> 2011/9/26 Pavel Porvatov <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.com>>
>>
>> Hi Sean,
>>> Hi Pavel,
>>>
>>> Thanks for the comments. I modified the testcase
>>> according to the comments,
>>> please have a look at it again.
>>> I tried to run with jtreg and it runs well.
>> Looks much better. Still have several comments:
>>
>> 1. Could you please sent complete fix as a webrev, but not
>> parts of the fix as a single file?
>>
>> 2. Date of copyright...
>>
>> 3. You are still using Swing components on non-EDT thread. As
>> I wrote before take a look at the
>> test\javax\swing\JSlider\6848475\bug6848475.java test...
>>
>> 4. Use toolkit.realSync() instead of toolkit.sync(). BTW: as
>> described in javadoc realSync cannot be invoked on the EDT
>> thread...
>>
>> Regards, Pavel
>>
>> P.S. Sorry for my stubborn =) But on some machines not
>> accurate tests actually fail (e.g. on Solaris). Therefore
>> later we must fix tests and that's a really boring task...
>>
>>
>>>
>>> 2011/9/20 Pavel Porvatov <pavel.porvatov at oracle.com
>>> <mailto:pavel.porvatov at oracle.com>>
>>>
>>> Hi Sean,
>>>
>>> The have several comments :
>>>
>>> 1. Could you please read http://openjdk.java.net/jtreg/
>>> is it possible run your test via jtreg?
>>>
>>> 2. There is no copyright in the begin of test
>>>
>>> 3. There are no jtreg tags
>>>
>>> 4. All Swing code must be initialized on the EDT thread
>>>
>>> 5. Keep test minimal as possible, please. It helps other
>>> people to understand your code.... E.g. there is no need
>>> to create JButton with listener.
>>>
>>> 6. Note that the "frame.setVisible(true)" doesn't
>>> guarantee that after that line Frame is visible, you
>>> should use toolkit.realSync() here
>>>
>>> 7. No TODO, please
>>>
>>> 8. Are you sure your test should pass if exceptions
>>> occurs (see your catch blocks)
>>>
>>> Please take a look at other tests and use them as a good
>>> examples....
>>>
>>> Regards, Pavel
>>>
>>>
>>>> Hi Pavel,
>>>>
>>>> I wrote a test case for the behavior of
>>>> DefaultCaret. Please take a look, it is
>>>> attached.
>>>>
>>>>
>>>>
>>>> 2011/9/15 Pavel Porvatov <pavel.porvatov at oracle.com
>>>> <mailto:pavel.porvatov at oracle.com>>
>>>>
>>>> Hi Sean,
>>>>> Hi Pavel,
>>>>>
>>>>> I'm comfortable with moving the checking into
>>>>> DefaultCaret#updateSystemSelection method.
>>>>> About regression test, I'm not sure how to
>>>>> write, because it contains user operation. Can you
>>>>> give me a similar test so I can write one for this
>>>>> bug?
>>>> Yes, you can find a lot examples in the
>>>> test/javax/swing directory by word Robot, e.g.
>>>> test\javax\swing\JSlider\6848475\bug6848475.java.
>>>> One hint: use reflection ONLY if there are no
>>>> another ways to write a test...
>>>>
>>>> Regards, Pavel
>>>>
>>>>>
>>>>> 2011/9/13 Pavel Porvatov
>>>>> <pavel.porvatov at oracle.com
>>>>> <mailto:pavel.porvatov at oracle.com>>
>>>>>
>>>>> Hi Sean,
>>>>>> Hi Pavel ,
>>>>>>
>>>>>> I'm sorry I didn't make update for this
>>>>>> bug for a long time, and here is some
>>>>>> recent investigation. The scenario is as follows:
>>>>>>
>>>>>> Suppose we are dragging "abcde" over
>>>>>> TextField tf, which have "hello dragging" as
>>>>>> its content. When we are dragging from start
>>>>>> to end, there is a cursor moving from
>>>>>> "h" to "g", which means the place to insert
>>>>>> "abcde" if we drop it.
>>>>>> When we dragging "abcde" exit tf, there will
>>>>>> be a dragExit event, the tf needs to
>>>>>> restore its original status after we drag
>>>>>> out. Eg. if its cursor is between "h" and
>>>>>> "e" in "hello", which appears like "h|ello",
>>>>>> when we are dragging over it, it may like
>>>>>> "hello dr|agging", and when drag exit, it
>>>>>> needs to be "h|ello" again.
>>>>>> So in dragExit handler, it calls
>>>>>> javax.swing.TransferHandler.cleanup(false),
>>>>>> which
>>>>>> means only to restore the original state.
>>>>>> cleanup calls
>>>>>> javax.swing.text.JTextComponent.setDropLocation
>>>>>> to set the cursor to original
>>>>>> position. And setDropLocation calls
>>>>>> DefaultCaret.setDot and DefaultCaret.moveDot
>>>>>> to set the state.
>>>>>> The problem is moveDot doesn't know this is
>>>>>> just to restore the original state,
>>>>>> it treats the invocation as an action to
>>>>>> select something. And it
>>>>>> calls updateSystemSelection
>>>>>> which will
>>>>>> call java.awt.datatransfer.Clipboard.setContent.
>>>>>> And the selected content
>>>>>> is changed from "abcde" to the original
>>>>>> selected part of "hello dragging", then
>>>>>> the drop operation finds it is not the string
>>>>>> dragged and nothing is dropped.
>>>>>>
>>>>>> So I made a simple patch(attached) . It just
>>>>>> check if the textField owns focus
>>>>>> before updateSystemSelection, if it is not
>>>>>> focused, it does not treat the moveDot as
>>>>>> a selection action and does not
>>>>>> call Clipboard.setContent. This works on Linux,
>>>>>> however, DefaultCaret is shared by Linux and
>>>>>> Windows while windows doesn't have
>>>>>> this problem. So I don't think this is a
>>>>>> correct patch, but it brings my question.
>>>>>>
>>>>>> I think it is strange for DefaultCaret to use
>>>>>> setDot and moveDot to restore
>>>>>> original state, especially moveDot will cause
>>>>>> an updateSystemSelection operation,
>>>>>> which makes moveDot much like an action from
>>>>>> user instead of just restoring state.
>>>>>>
>>>>>> I'm not sure why it works well on windows,
>>>>>> but I don't think it is right to call
>>>>>> updateSystemSelection or it is not right to
>>>>>> use setDot and moveDot to restore
>>>>>> the original state. Is there any reason for
>>>>>> that ?
>>>>> Thanks for the patch! I believe you are right
>>>>> and we shouldn't update system selection
>>>>> clipboard when the component doesn't have
>>>>> focus. I'd like to modify your fix and move
>>>>> checking into the
>>>>> DefaultCaret#updateSystemSelection method:
>>>>> if (this.dot != this.mark && component !=
>>>>> null && component.hasFocus()) {
>>>>>
>>>>> We also must write regression tests for fixes
>>>>> if possible, so an automatic test is needed as
>>>>> well. Could you please write a test for the fix?
>>>>>
>>>>>
>>>>> > I'm not sure why it works well on windows,
>>>>> That's because Windows doesn't have system
>>>>> selection clipboard...
>>>>>
>>>>>
>>>>> > Is there any reason for that ?
>>>>> No, that's a just bug...
>>>>>
>>>>> Regards, Pavel
>>>>>
>>>>>>
>>>>>> 2011/6/6 Pavel Porvatov
>>>>>> <pavel.porvatov at oracle.com
>>>>>> <mailto:pavel.porvatov at oracle.com>>
>>>>>>
>>>>>> Hi Sean,
>>>>>>> Hi,
>>>>>>>
>>>>>>> I reported, but the system doesn't reply
>>>>>>> me a bug number. It says "will give me
>>>>>>> email",
>>>>>>> but I haven't got one yet. Is this the
>>>>>>> right process, or I might make a problem
>>>>>>> when
>>>>>>> reporting?
>>>>>> I don't know why the system didn't report
>>>>>> bug ID, but your bug was filed
>>>>>> successfully. You can find it here:
>>>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7049024
>>>>>>
>>>>>> Regards, Pavel
>>>>>>
>>>>>>>
>>>>>>> 2011/5/27 Pavel Porvatov
>>>>>>> <pavel.porvatov at oracle.com
>>>>>>> <mailto:pavel.porvatov at oracle.com>>
>>>>>>>
>>>>>>> Hi Sean,
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> I have a testcase related to
>>>>>>>> DnD failure with JTextArea and
>>>>>>>> JTextField on linux. The
>>>>>>>> testcase is as follows:
>>>>>>>>
>>>>>>>> /*
>>>>>>>> * DnDTest.java
>>>>>>>> */
>>>>>>>> import java.awt.Color;
>>>>>>>> import java.awt.Component;
>>>>>>>> import java.awt.Dimension;
>>>>>>>> import java.awt.FlowLayout;
>>>>>>>> import java.awt.Frame;
>>>>>>>> import java.awt.event.WindowAdapter;
>>>>>>>> import java.awt.event.WindowEvent;
>>>>>>>>
>>>>>>>> import javax.swing.JTextArea;
>>>>>>>> import javax.swing.JTextField;
>>>>>>>>
>>>>>>>>
>>>>>>>> public class DnDTest extends Frame {
>>>>>>>> Component c;
>>>>>>>> public DnDTest() {
>>>>>>>> super("Single Frame --- AWT Frame");
>>>>>>>> super.setBackground(Color.gray);
>>>>>>>> // set layout here.
>>>>>>>> setLayout(new FlowLayout());
>>>>>>>> c = new JTextArea("JTextArea
>>>>>>>> component");
>>>>>>>> c.setPreferredSize(new
>>>>>>>> Dimension(400, 100));
>>>>>>>> add(c);
>>>>>>>> c = new JTextField("JTextField
>>>>>>>> component(No IM)");
>>>>>>>> c.setPreferredSize(new
>>>>>>>> Dimension(400, 20));
>>>>>>>> add(c);
>>>>>>>> addWindowListener(new WindowAdapter() {
>>>>>>>> public void
>>>>>>>> windowClosing(WindowEvent event) {
>>>>>>>> System.exit(0);
>>>>>>>> }
>>>>>>>> });
>>>>>>>> setSize(850, 360);
>>>>>>>> setVisible(true);
>>>>>>>> }
>>>>>>>> public static void main(String[]
>>>>>>>> args) {
>>>>>>>> new DnDTest();
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> Reproduce steps:
>>>>>>>> 1. Run the testcase with b143
>>>>>>>> 2. Open a new file with gedit and
>>>>>>>> input some words like "abcde"
>>>>>>>> 3. Drag "abcde" into JTextField and
>>>>>>>> drop it there.
>>>>>>>> 4. Once more, drag "abcde" into
>>>>>>>> JTextField and then move out of the
>>>>>>>> Frame (keep draging) and drag
>>>>>>>> into JTextField again and drop it.
>>>>>>>>
>>>>>>>> Expectation:
>>>>>>>> The second DnD inputs another
>>>>>>>> "abcde" into JTextField.
>>>>>>>>
>>>>>>>> Result:
>>>>>>>> The second DnD inputs nothing
>>>>>>>> into JTextField.
>>>>>>> Yes, looks like a bug. The test case
>>>>>>> works on Windows as expected.
>>>>>>>
>>>>>>>>
>>>>>>>> Investigation:
>>>>>>>> The JTextArea as well has this
>>>>>>>> problem, and in step 4, if we drag
>>>>>>>> "abcde" over JTextField and then
>>>>>>>> drop into JTextArea, nothing
>>>>>>>> is input into JTextArea either.
>>>>>>>> However, if "abcde" is drag
>>>>>>>> into JTextField or JTextArea
>>>>>>>> directly or when JTextArea/Field are
>>>>>>>> empty as in step 2, it works.
>>>>>>>>
>>>>>>>>
>>>>>>>> Are there any comments? And can
>>>>>>>> anyone file a bug for it please ?
>>>>>>> Anybody can file a bug,
>>>>>>> http://bugreport.sun.com/bugreport/
>>>>>>>
>>>>>>> Regards, Pavel
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Best Regards,
>>>>>>> Sean Chou
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best Regards,
>>>>>> Sean Chou
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Best Regards,
>>>>> Sean Chou
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Best Regards,
>>>> Sean Chou
>>>>
>>>
>>>
>>>
>>>
>>> --
>>> Best Regards,
>>> Sean Chou
>>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>
>
>
>
> --
> Best Regards,
> Sean Chou
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20110929/2b8e686e/attachment.html>
More information about the swing-dev
mailing list