那肯定就是JDK的问题了,你搜遍了吗

解决方案 »

  1.   

    a sample:import java.awt.*;
    import java.io.*;
    import java.util.*;
    import java.awt.event.*;
    import java.awt.dnd.*;
    import java.awt.datatransfer.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;public class ListDemo extends JFrame
                          implements ListSelectionListener
    {
        private DroppableList list;
        private JTextField fileName;    public ListDemo()
        {
            super("ListDemo");        //Create the list and put it in a scroll pane
            list = new DroppableList();
            DefaultListModel listModel = (DefaultListModel)list.getModel();
            list.setCellRenderer(new CustomCellRenderer());
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setSelectedIndex(0);
            list.addListSelectionListener(this);
            JScrollPane listScrollPane = new JScrollPane(list);        String dirName = new String("\\");
            String filelist[] = new File(dirName).list();
            for (int i=0; i < filelist.length ; i++ )
            {
                String thisFileSt = dirName+filelist[i];
                File thisFile = new File(thisFileSt);
                if (thisFile.isDirectory())
                    continue;
                try {
                    listModel.addElement(makeNode(thisFile.getName(),
                                                  thisFile.toURL().toString(),
                                                  thisFile.getAbsolutePath()));
                } catch (java.net.MalformedURLException e){
                }
            }        fileName = new JTextField(50);
            String name = listModel.getElementAt(
                                  list.getSelectedIndex()).toString();
            fileName.setText(name);        //Create a panel that uses FlowLayout (the default).
            JPanel buttonPane = new JPanel();
            buttonPane.add(fileName);        Container contentPane = getContentPane();
            contentPane.add(listScrollPane, BorderLayout.CENTER);
            contentPane.add(buttonPane, BorderLayout.NORTH);
        }    public void valueChanged(ListSelectionEvent e)
        {
            if (e.getValueIsAdjusting() == false)
            {
                fileName.setText("");
                if (list.getSelectedIndex() != -1)
                {
                    String name = list.getSelectedValue().toString();
                    fileName.setText(name);
                }
            }
        }    private static Hashtable makeNode(String name,
            String url, String strPath)
        {
            Hashtable hashtable = new Hashtable();
            hashtable.put("name", name);
            hashtable.put("url", url);
            hashtable.put("path", strPath);
            return hashtable;
        }    public class DroppableList extends JList
            implements DropTargetListener, DragSourceListener, DragGestureListener
        {
            DropTarget dropTarget = new DropTarget (this, this);
            DragSource dragSource = DragSource.getDefaultDragSource();        public DroppableList()
            {
              dragSource.createDefaultDragGestureRecognizer(
                  this, DnDConstants.ACTION_COPY_OR_MOVE, this);
              setModel(new DefaultListModel());
            }        public void dragDropEnd(DragSourceDropEvent DragSourceDropEvent){}
            public void dragEnter(DragSourceDragEvent DragSourceDragEvent){}
            public void dragExit(DragSourceEvent DragSourceEvent){}
            public void dragOver(DragSourceDragEvent DragSourceDragEvent){}
            public void dropActionChanged(DragSourceDragEvent DragSourceDragEvent){}        public void dragEnter (DropTargetDragEvent dropTargetDragEvent)
            {
              dropTargetDragEvent.acceptDrag (DnDConstants.ACTION_COPY_OR_MOVE);
            }        public void dragExit (DropTargetEvent dropTargetEvent) {}
            public void dragOver (DropTargetDragEvent dropTargetDragEvent) {}
            public void dropActionChanged (DropTargetDragEvent dropTargetDragEvent){}        public synchronized void drop (DropTargetDropEvent dropTargetDropEvent)
            {
                try
                {
                    Transferable tr = dropTargetDropEvent.getTransferable();
                    if (tr.isDataFlavorSupported (DataFlavor.javaFileListFlavor))
                    {
                        dropTargetDropEvent.acceptDrop (
                            DnDConstants.ACTION_COPY_OR_MOVE);
                        java.util.List fileList = (java.util.List)
                            tr.getTransferData(DataFlavor.javaFileListFlavor);
                        Iterator iterator = fileList.iterator();
                        while (iterator.hasNext())
                        {
                          File file = (File)iterator.next();
                          Hashtable hashtable = new Hashtable();
                          hashtable.put("name",file.getName());
                          hashtable.put("url",file.toURL().toString());
                          hashtable.put("path",file.getAbsolutePath());
                          ((DefaultListModel)getModel()).addElement(hashtable);
                        }
                        dropTargetDropEvent.getDropTargetContext().dropComplete(true);
                  } else {
                    System.err.println ("Rejected");
                    dropTargetDropEvent.rejectDrop();
                  }
                } catch (IOException io) {
                    io.printStackTrace();
                    dropTargetDropEvent.rejectDrop();
                } catch (UnsupportedFlavorException ufe) {
                    ufe.printStackTrace();
                    dropTargetDropEvent.rejectDrop();
                }
            }        public void dragGestureRecognized(DragGestureEvent dragGestureEvent)
            {
                if (getSelectedIndex() == -1)
                    return;
                Object obj = getSelectedValue();
                if (obj == null) {
                    // Nothing selected, nothing to drag
                    System.out.println ("Nothing selected - beep");
                    getToolkit().beep();
                } else {
                    Hashtable table = (Hashtable)obj;
                    FileSelection transferable =
                      new FileSelection(new File((String)table.get("path")));
                    dragGestureEvent.startDrag(
                      DragSource.DefaultCopyDrop,
                      transferable,
                      this);
                }
            }
        }
      

  2.   

    public class CustomCellRenderer implements ListCellRenderer
        {
            DefaultListCellRenderer listCellRenderer =
              new DefaultListCellRenderer();
            public Component getListCellRendererComponent(
                JList list, Object value, int index,
                boolean selected, boolean hasFocus)
            {
                listCellRenderer.getListCellRendererComponent(
                  list, value, index, selected, hasFocus);
                listCellRenderer.setText(getValueString(value));
                return listCellRenderer;
            }
            private String getValueString(Object value)
            {
                String returnString = "null";
                if (value != null) {
                  if (value instanceof Hashtable) {
                    Hashtable h = (Hashtable)value;
                    String name = (String)h.get("name");
                    String url = (String)h.get("url");
                    returnString = name + " ==> " + url;
                  } else {
                    returnString = "X: " + value.toString();
                  }
                }
                return returnString;
            }
        }    public class FileSelection extends Vector implements Transferable
        {
            final static int FILE = 0;
            final static int STRING = 1;
            final static int PLAIN = 2;
            DataFlavor flavors[] = {DataFlavor.javaFileListFlavor,
                                    DataFlavor.stringFlavor,
                                    DataFlavor.plainTextFlavor};
            public FileSelection(File file)
            {
                addElement(file);
            }
            /* Returns the array of flavors in which it can provide the data. */
            public synchronized DataFlavor[] getTransferDataFlavors() {
         return flavors;
            }
            /* Returns whether the requested flavor is supported by this object. */
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                boolean b  = false;
                b |=flavor.equals(flavors[FILE]);
                b |= flavor.equals(flavors[STRING]);
                b |= flavor.equals(flavors[PLAIN]);
             return (b);
            }
            /**
             * If the data was requested in the "java.lang.String" flavor,
             * return the String representing the selection.
             */
            public synchronized Object getTransferData(DataFlavor flavor)
         throws UnsupportedFlavorException, IOException {
         if (flavor.equals(flavors[FILE])) {
             return this;
         } else if (flavor.equals(flavors[PLAIN])) {
             return new StringReader(((File)elementAt(0)).getAbsolutePath());
         } else if (flavor.equals(flavors[STRING])) {
             return((File)elementAt(0)).getAbsolutePath();
         } else {
             throw new UnsupportedFlavorException(flavor);
         }
            }
        }    public static void main(String s[])
        {
            JFrame frame = new ListDemo();
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            frame.pack();
            frame.setVisible(true);
        }
    }
      

  3.   

    关于Dnd的大致看了一遍,好象是没有.
      

  4.   

    是不是有什么方法设置可以接收drop的?我以前做过一个拖放的程序,而且是applet,也是问题多多,在appletviewer里正常拿到ie里就不行了。后来整个重做了一遍就好了,奇怪!
    另外,可以从别的程序(比如word)里拖文本到你的表格里试试,这样可以排除拖放源那边的问题。good luck
      

  5.   

    java 核心技术II 书上有例子。
      

  6.   

    applet好象Java本身就有Bug,我在java.sun.com上看到它的Bug report
    java 核心技术II书上的我知道,但是不是那个问题的,呵呵,谢谢.
      

  7.   

    这是我的一个测试程序import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.dnd.*;
    import java.awt.datatransfer.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2002</p>
     * <p>Company: </p>
     * @author unascribed
     * @version 1.0
     */public class FrmTest1 extends JFrame {
        private JButton jButton1 = new JButton();
        String sTbl1 = "tbl1";
        String sTbl2 = "tbl2";
        String[] sCols1 = {"a1","b1","c1","d","e","f","g","h","i"};
        String[] sCols2 = {"a2","b2","c2"};
        private JTextField jTable1 = new JTextField(sTbl1);
        private JTextField jTable2 = new JTextField(sTbl2);
        public FrmTest1() {
            try {
                jbInit();
                //ウィンドウを中央に配置
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                Dimension frameSize = this.getSize();
                if (frameSize.height > screenSize.height)
                    frameSize.height = screenSize.height;
                if (frameSize.width > screenSize.width)
                    frameSize.width = screenSize.width;
                this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
                this.setVisible(true);
                new DropTarget(jTable2, DnDConstants.ACTION_LINK,new TblDropListenre());
                DragSource dragSource = DragSource.getDefaultDragSource();
                dragSource.createDefaultDragGestureRecognizer(
                        jTable1, // component where drag originates
                        DnDConstants.ACTION_LINK, // actions
                        new TblGesture());
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            FrmTest1 frmTest1 = new FrmTest1();
            frmTest1.show();
        }
        private void jbInit() throws Exception {
            this.setSize(400,300);
            jButton1.setBounds(new Rectangle(41, 29, 58, 16));
            jButton1.setText("jButton1");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    jButton1_actionPerformed(e);
                }
            });
            this.getContentPane().setLayout(null);
            jTable1.setBounds(new Rectangle(37, 89, 136, 98));
            jTable2.setBounds(new Rectangle(199, 87, 146, 102));
            this.getContentPane().add(jButton1, null);
            this.getContentPane().add(jTable1, null);
            this.getContentPane().add(jTable2, null);
        }    void jButton1_actionPerformed(ActionEvent e) {    }
        class TblDragListener implements DragSourceListener{
            public void dragEnter(DragSourceDragEvent dsde){
                System.out.println("dragEnter(DragSourceDragEvent dsde)");
            }
            public void dragOver(DragSourceDragEvent dsde){
                System.out.println("dragOver(DragSourceDragEvent dsde)");
            }
            public void dragDropEnd(DragSourceDropEvent dsde){
                System.out.println("dragDropEnd(DragSourceDropEvent dsde)");
            }
            public void dropActionChanged(DragSourceDragEvent dsde){
                System.out.println("dropActionChanged(DragSourceDragEvent dsde)");
            }
            public void dragExit(DragSourceEvent dse){
                System.out.println("dragExit(DragSourceEvent dse)");
            }
        }
        class TblDropListenre implements DropTargetListener{
            public void dragEnter(DropTargetDragEvent dtde){
                System.out.println("dragEnter(DropTargetDragEvent dtde)");
            }
            public void dragOver(DropTargetDragEvent dtde){
                System.out.println("dragOver(DropTargetDragEvent dtde)");
            }
            public void dropActionChanged(DropTargetDragEvent dtde){
                System.out.println("dropActionChanged(DropTargetDragEvent dtde)");
            }
            public void dragExit(DropTargetEvent dte){
                System.out.println("dragExit(DropTargetEvent dte)");
            }
            public void drop(DropTargetDropEvent e){
                System.out.println("drop(DropTargetDropEvent e)");
            }
        }
        class TblGesture implements DragGestureListener{
            public void dragGestureRecognized(DragGestureEvent dge){
                System.out.println("dragGestureRecognized(DragGestureEvent dge)");
                int i = 1;
                DragData dd = new DragData(null,i);
                StrDataTransfer dataTransfer =  new StrDataTransfer(dd);
                if(dataTransfer == null){
                    return;
                }
                dge.startDrag(DragSource.DefaultLinkDrop,dataTransfer,new TblDragListener());
            }
        }
        class StrDataTransfer implements Transferable{
            DragData data;
            DataFlavor flavor;
            public StrDataTransfer(JPanel tbl,int col){
                this.data = new DragData(tbl,col);
                try{
                    flavor = new DataFlavor(Class.forName("FrmTest1$DragData"),"DragData");
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            public StrDataTransfer(DragData df){
                this.data = df;
                try{
                    flavor = new DataFlavor(Class.forName("FrmTest1$DragData"),"DragData");
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            public Object getTransferData(DataFlavor flavor) {
                if(isDataFlavorSupported(flavor))
                    return data;
                return null;
            }
            public DataFlavor[] getTransferDataFlavors(){
                DataFlavor[] df = {flavor};
                return df;
            }
            public boolean isDataFlavorSupported(DataFlavor flavor1){
                if(flavor1.equals(flavor))
                    return true;
                return false;
            }
        }
        class DragData{
            private JPanel table;
            private int iCol;
            public DragData(JPanel tbl,int iCol){
                this.table = tbl;
                this.iCol = iCol;
            }
            public JPanel getTable(){
                return table;
            }
            public int getCol(){
                return iCol;
            }
        }
    }