United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-4874070 invoking DragSource's startDrag with an Image renders no image on drag
JDK-4874070 : invoking DragSource's startDrag with an Image renders no image on drag

Details
Type:
Enhancement
Submit Date:
2003-06-04
Status:
Resolved
Updated Date:
2010-02-16
Project Name:
JDK
Resolved Date:
2010-02-16
Component:
client-libs
OS:
windows_xp,windows_2000
Sub-Component:
java.awt
CPU:
x86
Priority:
P3
Resolution:
Fixed
Affected Versions:
1.4.0,1.4.1,1.4.2,5.0
Fixed Versions:

Related Reports
Duplicate:
Duplicate:
Relates:
Relates:
Relates:
Relates:
Relates:

Sub Tasks

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) 
======================================================================

                                    

Comments
EVALUATION

Name: agR10216			Date: 06/09/2003


The fact that no icon appears during a drag is in accordance
with that DragSource.isDragImageSupported() returns false.
This issue may be considered as a RFE to implement rendering
an image during a drag.

###@###.###  2003-06-09


======================================================================
                                     
2003-06-09
WORK AROUND

Move a Window with an image rendered on it as the mouse cursor moves during a DnD operation.
Below is a sample code:

import java.awt.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;

public class DragImageWorkaround {

    public static void main(String[] args) {
        Label lab1 = new Label("source and target"),
              lab2 = new Label("no drop"),
              lab3 = new Label("target");

        Frame f = new Frame("DragImageWorkaround");
        f.setSize(600, 200);
        f.setLayout(new GridLayout(1, 0));
        f.add(lab1);
        f.add(lab2);
        f.add(lab3);

        final Window w = new Window(f) {
            public void paint(Graphics g) {
                g.drawString("image", 5, 20); // or render an image via g.drawImage()
            }
        };
        w.setSize(50, 50);
        w.setBackground(Color.GREEN);

        final WindowMovingDragSourceListener wmdsl = new WindowMovingDragSourceListener(w);
        DragGestureListener dgl = new DragGestureListener() {
            public void dragGestureRecognized(DragGestureEvent dge) {
                dge.startDrag(null, new StringSelection("data"), wmdsl);
            }
        };
        DragSource ds = new DragSource();
        ds.addDragSourceMotionListener(wmdsl);
        ds.createDefaultDragGestureRecognizer(lab1, DnDConstants.ACTION_COPY, dgl);

        DropTargetAdapter dtl = new DropTargetAdapter() {
            public void drop(DropTargetDropEvent dtde) {
                final Transferable t = dtde.getTransferable();
                if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY);
                    try {
                        String str = (String)t.getTransferData(DataFlavor.stringFlavor);
                        System.err.println("dropped data=" + str);
                        dtde.dropComplete(true);
                    } catch (Exception e) {
                        dtde.dropComplete(false);
                    }
                } else {
                    dtde.rejectDrop();
                }
            }
        };
        new DropTarget(lab1, dtl);
        new DropTarget(lab3, dtl);

        f.setVisible(true);
    }
}


class WindowMovingDragSourceListener extends DragSourceAdapter implements DragSourceMotionListener {

    private Window win;
    private boolean firstCall = true;

    public WindowMovingDragSourceListener(Window w) {
        win = w;
    }

    public void dragDropEnd(DragSourceDropEvent dsde) {
        System.err.println("dragDropEnd(): " + dsde);
        win.setVisible(false);
        firstCall = true;
    }

    public void dragMouseMoved(DragSourceDragEvent dsde) {
        Point p = dsde.getLocation();
        p.translate(32, 16);
        win.setLocation(p);
        if (firstCall) {
            win.setVisible(true);
            firstCall = false;
        }
    }
}

###@###.### 2004-09-06
                                     
2004-09-06
EVALUATION

There is the custom Windows Shell interface that is supporting requred functionality. The problem have to be reinvestigated to support requred action.
                                     
2006-10-06
SUGGESTED FIX

webrev:
http://sa.sfbay.sun.com/projects/awt_data/7/4874070/
                                     
2009-12-24



Hardware and Software, Engineered to Work Together