-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
1.2.0
-
x86
-
windows_nt
Name: vi73552 Date: 03/09/99
If, in the drop method of a Drop Target Listener, a Frame
(or JFrame or JDialog . . . ) is displayed, the system
hangs. If the call to dropComplete() occurs after the
call to setVisible() for the Frame, the system hangs after
the drop method terminates. If dropComplete() is called
before the Frame is instantiated and displayed, the system
hangs in the pack() method on the Frame. The following
code can be used to reproduce the problem (although, we've
found it happens consistently in any app in which we've
tried to do this, whether Swing or AWT). Also, see the
workaround section for more info.
// start Main.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Main
{
public static void main(String[] args)
{
Applet applet = new TestDNDApplet();
Frame frame = new Frame();
frame.setTitle("Test DND Applet");
frame.add(applet, BorderLayout.CENTER);
frame.addWindowListener(new WindowCloser());
applet.init();
applet.start();
frame.setSize(400,80);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((d.width - frame.getSize().width) / 2,
(d.height - frame.getSize().height) / 2);
frame.setVisible(true);
}
}
class WindowCloser extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
Window w = e.getWindow();
w.setVisible(false);
w.dispose();
System.exit(0);
}
}
// end Main.java
// start TestDNDApplet.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
public class TestDNDApplet extends Applet
{
public void init()
{
Component c1, c2;
Panel p = new Panel();
p.setBackground(Color.white);
c1 = new DropableTextField("Drop this ");
p.add(c1);
c2 = new DragableTextField("Drag this ");
p.add(c2);
add(p);
setVisible(true);
}
}
// end TestDNDApplet.java
// start DragableTextField.java
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
public class DragableTextField extends TextField implements Transferable,
DragGestureListener, DragSourceListener
{
DragableTextField(String s)
{
super(s);
DragSource ds = DragSource.getDefaultDragSource();
ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY, this);
}
public void dragGestureRecognized( DragGestureEvent dge)
{
dge.startDrag(null, this, this);
}
public void dragEnter(DragSourceDragEvent dsde)
{
dsde.getDragSourceContext().setCursor( DragSource.DefaultCopyDrop);
}
public void dragOver(DragSourceDragEvent dsde)
{
}
public void dragGestureChanged( DragSourceDragEvent dsde)
{
}
public void dragExit(DragSourceEvent dse)
{
dse.getDragSourceContext().setCursor(null);
}
public void dragDropEnd(DragSourceDropEvent dsde)
{
}
public void dropActionChanged(DragSourceDragEvent e)
{
}
public DataFlavor[] getTransferDataFlavors()
{
return supportedDataFlavors;
}
public boolean isDataFlavorSupported(DataFlavor dataFlavor)
{
for (int i = 0; i < supportedDataFlavors.length; i++)
if (supportedDataFlavors[i].equals(dataFlavor)) return true;
return false;
}
public Object getTransferData(DataFlavor tdf)
throws UnsupportedFlavorException, IOException
{
if (!isDataFlavorSupported(tdf)) throw new UnsupportedFlavorException(tdf);
String text = getText();
if (DataFlavor.plainTextFlavor.equals(tdf))
{
return new ByteArrayInputStream(text.getBytes());
}
else
{
throw new UnsupportedFlavorException(tdf);
}
}
private static DataFlavor supportedDataFlavors[] = new DataFlavor[]
{
DataFlavor.plainTextFlavor
};
}
// end DragableTextField.java
// start DropableTextField.java
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
public class DropableTextField extends TextField implements DropTargetListener
{
DropableTextField(String text)
{
super(text);
setDropTarget(new DropTarget(this, this));
}
public void dragEnter(DropTargetDragEvent e)
{
e.acceptDrag(DnDConstants.ACTION_COPY);
}
public void dragOver(DropTargetDragEvent e)
{
e.acceptDrag(DnDConstants.ACTION_COPY);
}
public void dragExit(DropTargetEvent e)
{
repaint();
}
public void drop(DropTargetDropEvent dtde)
{
if ((dtde.getSourceActions() & DnDConstants.ACTION_COPY) != 0)
dtde.acceptDrop(DnDConstants.ACTION_COPY);
else
{
dtde.rejectDrop();
return;
}
DataFlavor[] supportedDataFlavors = dtde.getCurrentDataFlavors();
boolean outcome = false;
for (int i = 0; i < supportedDataFlavors.length; i++)
{
if (DataFlavor.plainTextFlavor.equals(supportedDataFlavors[i]))
{
outcome = getPlainText(dtde, supportedDataFlavors[i]);
break;
}
}
repaint();
// when dropComplete() is called here instead of later, the
// system hangs in f.pack()
// HERE IS THE BUG:
System.out.println("creating frame");
Frame f = new Frame();
System.out.println("adding button");
f.add(new Button("button"));
System.out.println("packing frame");
f.pack();
System.out.println("displaying frame");
f.setVisible(true);
System.out.println("done");
// END BUG
dtde.getDropTargetContext().dropComplete(outcome);
System.out.println("leaving drop()");
}
private boolean getPlainText(DropTargetDropEvent dtde, DataFlavor dataFlavor)
{
try
{
InputStream is = (InputStream) dtde.getTransferable().
getTransferData(dataFlavor);
if (is != null)
{
try
{
int len = is.available();
byte[] string = new byte[len];
is.read(string, 0, len);
String s = new String(string, 0, len);
setText(s);
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
catch (UnsupportedFlavorException ufe)
{
ufe.printStackTrace();
}
return false;
}
public void dragScroll(DropTargetDragEvent e)
{
}
public void dropActionChanged(DropTargetDragEvent e)
{
}
}
// end DropableTextField.java
(Review ID: 53531)
======================================================================
- duplicates
-
JDK-4269666 Kestrel-FCS-E:Drag and Drop on Windows platform causes app to freeze.
-
- Closed
-