Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4874070

invoking DragSource's startDrag with an Image renders no image on drag

    Details

    • Type: Enhancement
    • Status: Resolved
    • Priority: P3
    • Resolution: Fixed
    • Affects Version/s: 1.4.0, 1.4.1, 1.4.2, 5.0
    • Fix Version/s: 7
    • Component/s: client-libs
    • Labels:
    • Subcomponent:
    • Introduced In Version:
      7
    • Resolved In Build:
      b84
    • CPU:
      x86
    • OS:
      windows_2000, windows_xp

      Description

      Name: rmT116609 Date: 06/04/2003


      FULL PRODUCT VERSION :
      java version "1.4.2-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-beta-b19)
      Java HotSpot(TM) Client VM (build 1.4.2-beta-b19, mixed mode)

      FULL OS VERSION :
      Microsoft Windows 2000 [Version 5.00.2195]

      A DESCRIPTION OF THE PROBLEM :
      invoking DragSource's startDrag with an Image renders no image on drag

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      i. compile the attached class
      ii. run TestDND under 1.4.2-beta, or 1.4.1 on windows 2000 and winXP
      iii. attempt to drag an item from one column to another.
      iv. note that no icon appears during the drag.
      v. run TestDND under 1.4.1 on osX
      vi. note that an icon appears correctly.


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      an icon should appear during the drag.
      ACTUAL -
      no icon appears during the drag under windows 2000/xp with 1.4.1 and 1.4.2-beta; icon does appear under osX with 1.4.1

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /**
       * This code is just cobbled together and barely augmented from Sheetal Gupta's
       * demo code which was at
       * http://java.sun.com/docs/books/tutorial/dnd/sheetal.html
       * until recently; it's been augmented to show that the DND icon doesn't
       * render at all under Windows 1.4.1+ (haven't verified prior versions) -
       * amazingly, this works under osX 1.4.1.<br>
       *
       * This bug was originally filed and given an internal reference number of
       * 185600; it was never reviewed even though this is plainly a bug, and
       * other bugs i filed since were allowed entry into the database - i can
       * only assume it's because my original filing included code snippets
       * saying basically "here's snippets, modify sheetal's code" -- so this
       * time i've included all the code in one bloated class, and not including
       * the useless interface sheetal defined.<br>
       *
       * Sorry for the crappy formatting - it's just copy and paste (except my icon
       * additions) from the above url.<br>
       */

      import java.awt.*;
      import java.awt.event.*;
      import java.awt.dnd.*;
      import java.awt.datatransfer.*;
      import java.io.*;
      import java.net.URL;
      import java.util.*;

      import javax.swing.*;


      public class TestDND
      {
            public static void main (String args[]) {
      TestDND testDND = new TestDND();
          }

           /**
            * constructor
            * creates the frame, the lists in it and sets the data in the lists
            */
            
           public TestDND()
           {
      JFrame f = new JFrame("Drag and Drop Lists");

      DNDList sourceList = new DNDList();

      // add data to the source List
      DefaultListModel sourceModel = new DefaultListModel();

      sourceModel.addElement( "Source Item1");
      sourceModel.addElement( "Source Item2");
      sourceModel.addElement( "Source Item3");
      sourceModel.addElement( "Source Item4");

      // gets the panel with the List and a heading for the List
      JPanel sourcePanel = getListPanel(sourceList, "SourceList", sourceModel);

      DNDList targetList = new DNDList();

      // add data to the target List
      DefaultListModel targetModel = new DefaultListModel();

      targetModel.addElement( "Target Item1");
      targetModel.addElement( "Target Item2");
      targetModel.addElement( "Target Item3");
      targetModel.addElement( "Target Item4");

      JPanel targetPanel = getListPanel(targetList, "TargetList", targetModel);
      JPanel mainPanel = new JPanel();
      mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));
      mainPanel.add( sourcePanel );
      mainPanel.add( targetPanel );

      f.getContentPane().add( mainPanel );
      f.setSize (300, 300);
      f.addWindowListener (new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
      System.exit(0);
      }
      });
      f.setVisible (true);
            }

            /**
             * a convenience method
             * used for positioning of the ListBox and the Label.
             *
             * @param list - the special DND List
             * @param labelName - the heading for the list
             * @param listModel - model for the list
             */
           
            private JPanel getListPanel(DNDList list, String labelName, DefaultListModel listModel ){
      JPanel listPanel = new JPanel();
      JScrollPane scrollPane = new JScrollPane(list);

      list.setModel(listModel);
      JLabel nameListName = new JLabel(labelName );

      listPanel.setLayout( new BorderLayout());
      listPanel.add(nameListName, BorderLayout.NORTH);
      listPanel.add( scrollPane, BorderLayout.CENTER);

      return listPanel;
            }
        

          protected class DNDList extends JList
      implements DropTargetListener,DragSourceListener, DragGestureListener {

            /**
             * enables this component to be a dropTarget
             */

            DropTarget dropTarget = null;

            /**
             * enables this component to be a Drag Source
             */
            DragSource dragSource = null;

            ImageIcon ii = null;


            /**
             * constructor - initializes the DropTarget and DragSource.
             */

            public DNDList() {

      dropTarget = new DropTarget (this, this);
      dragSource = new DragSource();
      dragSource.createDefaultDragGestureRecognizer( this, DnDConstants.ACTION_MOVE, this);
      try {
      URL u = new URL("http://java.sun.com/docs/books/tutorial/images/TOCIcon.gif");

      this.ii = new ImageIcon(u);
      } catch (Exception e) {
      System.err.println("Exception in grabbing image icon: " + e);
      }

            }

            /**
             * is invoked when you are dragging over the DropSite
             *
             */

            public void dragEnter (DropTargetDragEvent event) {

      // debug messages for diagnostics
      System.out.println( "dragEnter");
      event.acceptDrag (DnDConstants.ACTION_MOVE);
            }

            /**
             * is invoked when you are exit the DropSite without dropping
             *
             */

            public void dragExit (DropTargetEvent event) {
      System.out.println( "dragExit");

            }

            /**
             * is invoked when a drag operation is going on
             *
             */

            public void dragOver (DropTargetDragEvent event) {
      System.out.println( "dragOver");
            }

            /**
             * a drop has occurred
             *
             */


           
            public void drop (DropTargetDropEvent event) {

      try {
      Transferable transferable = event.getTransferable();

      // we accept only Strings
      if (transferable.isDataFlavorSupported (DataFlavor.stringFlavor)){

      event.acceptDrop(DnDConstants.ACTION_MOVE);
      String s = (String)transferable.getTransferData ( DataFlavor.stringFlavor);
      addElement( s );
      event.getDropTargetContext().dropComplete(true);
      }
      else{
      event.rejectDrop();
      }
      }
      catch (IOException exception) {
      exception.printStackTrace();
      System.err.println( "Exception" + exception.getMessage());
      event.rejectDrop();
      }
      catch (UnsupportedFlavorException ufException ) {
      ufException.printStackTrace();
      System.err.println( "Exception" + ufException.getMessage());
      event.rejectDrop();
      }
            }

            /**
             * is invoked if the use modifies the current drop gesture
             *
             */


            public void dropActionChanged ( DropTargetDragEvent event ) {
            }

            /**
             * a drag gesture has been initiated
             *
             */
            
            public void dragGestureRecognized( DragGestureEvent event) {

      Object selected = getSelectedValue();
      if ( selected != null ){
      StringSelection text = new StringSelection( selected.toString());

      // as the name suggests, starts the dragging
      dragSource.startDrag (event, DragSource.DefaultMoveDrop, this.ii.getImage(),
      new Point(5, 5), text, this);
      } else {
      System.out.println( "nothing was selected");
      }
            }

            /**
             * this message goes to DragSourceListener, informing it that the dragging
             * has ended
             *
             */

            public void dragDropEnd (DragSourceDropEvent event) {
      if ( event.getDropSuccess()){
      removeElement();
      }
            }

            /**
             * this message goes to DragSourceListener, informing it that the dragging
             * has entered the DropSite
             *
             */

            public void dragEnter (DragSourceDragEvent event) {
      System.out.println( " dragEnter");
            }

            /**
             * this message goes to DragSourceListener, informing it that the dragging
             * has exited the DropSite
             *
             */

            public void dragExit (DragSourceEvent event) {
      System.out.println( "dragExit");

            }

            /**
             * this message goes to DragSourceListener, informing it that the dragging is currently
             * ocurring over the DropSite
             *
             */

            public void dragOver (DragSourceDragEvent event) {
      System.out.println( "dragExit");

            }

            /**
             * is invoked when the user changes the dropAction
             *
             */
             
            public void dropActionChanged ( DragSourceDragEvent event) {
      System.out.println( "dropActionChanged");
            }

            /**
             * adds elements to itself
             *
             */
             
             public void addElement( Object s ){
      (( DefaultListModel )getModel()).addElement (s.toString());
            }

            /**
             * removes an element from itself
             */
             
            public void removeElement(){
      (( DefaultListModel)getModel()).removeElement( getSelectedValue());
            }
            
          }

      }

      ---------- END SOURCE ----------

      (Review ID: 186473)
      ======================================================================

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                uta Alexey Utkin (Inactive)
                Reporter:
                rmandalasunw Ranjith Mandala (Inactive)
              • Votes:
                0 Vote for this issue
                Watchers:
                0 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Imported:
                  Indexed: