<Swing Dev> DnD fails with JTextArea and JTextField

Sean Chou zhouyx at linux.vnet.ibm.com
Tue Sep 27 23:57:49 UTC 2011


Hi Neil,

   Thanks for that, but I think the testcase may still needs some
modification about using
realSynch and putting all swing code into EDT.

2011/9/27 Neil Richards <neil.richards at ngmr.net>

> Hi Sean, Pavel,
>
> For ease of review, I've uploaded a webrev [1] with a slightly updated
> form of the current suggested fix and testcase, in which:
>
>      * The checking code is moved into updateSystemSelection, as
>        suggested
>      * The testcase is in a (hopefully) sensible location
>      * The testcase copyright text is as previously agreed
>      * The copyright year is corrected (to 2011)
>
> I'll look to track this conversation for any further changes to the
> suggested fix, and update the webrev as necessary.
>
> Regards, Neil
>
> [1] http://cr.openjdk.java.net/~ngmr/7049024/webrev.01/
>
>
> On Mon, 2011-09-26 at 14:45 +0400, Pavel Porvatov wrote:
> > 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>
> > >         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>
> > >         >         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>
> > >         >         >         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>
> > >         >         >         >         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>
> > >         >         >         >         >         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>
> > >         >         >         >         >         >         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
> > >
> > >
> >
>
>
> --
> Unless stated above:
> IBM email: neil_richards at uk.ibm.com
> IBM United Kingdom Limited - Registered in England and Wales with number
> 741598.
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
>
>


-- 
Best Regards,
Sean Chou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20110928/ffdd6e6c/attachment.html>


More information about the swing-dev mailing list