JDK-4874070 : invoking DragSource's startDrag with an Image renders no image on drag
  • Type: Enhancement
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 1.4.0,1.4.1,1.4.2,5.0
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: windows_2000,windows_xp
  • CPU: x86
  • Submitted: 2003-06-04
  • Updated: 2021-01-04
  • Resolved: 2010-02-16
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b84Fixed
Related Reports
Duplicate :  
Duplicate :  
Relates :  
Relates :  
Relates :  
Relates :  
Relates :  
Relates :  
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
SUGGESTED FIX webrev: http://sa.sfbay.sun.com/projects/awt_data/7/4874070/
24-12-2009

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

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
06-09-2004

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 ======================================================================
09-06-2003