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

display of Frame in drop method of a DropTargetListener causes freeze

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 1.2.0
    • client-libs
    • 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)
      ======================================================================

            dmendenhsunw David Mendenhall (Inactive)
            vasya Vassili Igouchkine (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: