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); } } }
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); } }
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);
}
}
}
{
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);
}
}
另外,可以从别的程序(比如word)里拖文本到你的表格里试试,这样可以排除拖放源那边的问题。good luck
java 核心技术II书上的我知道,但是不是那个问题的,呵呵,谢谢.
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;
}
}
}