<Swing Dev> DnD fails with JTextArea and JTextField
Pavel Porvatov
pavel.porvatov at oracle.com
Mon Sep 26 10:45:10 UTC 2011
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20110926/ce59516e/attachment.html>
More information about the swing-dev
mailing list