<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