import javax.swing.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
public class DragLabel extends JLabel implements DropTargetListener{
public DragLabel(String str){
super(str); //调用父类构造函数
}
public void dragEnter(DropTargetDragEvent evt) {
}
public void dragOver(DropTargetDragEvent evt) {
}
public void dropActionChanged(DropTargetDragEvent evt) {
}
public void dragExit(DropTargetEvent evt) {
}
public void drop(DropTargetDropEvent evt) { //拖动操作处理
try{
Transferable trans = evt.getTransferable(); //得以Transferable对象
if (evt.isDataFlavorSupported(DataFlavor.stringFlavor)){ //是否支持拖动
evt.acceptDrop(evt.getDropAction()); //接受拖动
String s = (String) trans.getTransferData(DataFlavor.stringFlavor); //得到拖动数据
setText(s); //设置标签的文本
evt.dropComplete(true); //结束拖动
}else{
evt.rejectDrop(); //拒绝托运
}
}catch(Exception err){
err.printStackTrace(); //输出出错信息
}
}
}
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import javax.swing.*;
public class DragList extends JList implements DragGestureListener, DragSourceListener{
DragSource dragSource=DragSource.getDefaultDragSource(); //拖动源
public DragList(Object[] data){ //构造函数
super(data);
int action = DnDConstants.ACTION_COPY_OR_MOVE; //拖动类型
dragSource.createDefaultDragGestureRecognizer(this,action,this); //创建拖动识别
}
public void dragGestureRecognized(DragGestureEvent dge) {
try{
Transferable trans = new StringSelection(this.getSelectedValue().toString()); //得到拖动的Transferable对象
dge.startDrag(DragSource.DefaultCopyNoDrop,trans,this); //开始拖动操作
}catch(Exception err){
err.printStackTrace(); //输出错误信息
}
}
public void dragEnter(DragSourceDragEvent dragSourcede) { //拖动进入处理
DragSourceContext dragSourceContext = dragSourcede.getDragSourceContext(); //得到拖动上下文对象
int action = dragSourcede.getDropAction(); //得到拖动命令
if ((action&DnDConstants.ACTION_COPY)!=0) //判断命令类型
dragSourceContext.setCursor(DragSource.DefaultCopyDrop); //设置光标类型
else
dragSourceContext.setCursor(DragSource.DefaultCopyNoDrop);
}
public void dragOver(DragSourceDragEvent dragSourcede) {
}
public void dropActionChanged(DragSourceDragEvent dragSourcede) {
}
public void dragExit(DragSourceEvent dragSourcee) {
}
public void dragDropEnd(DragSourceDropEvent dragSourcede) {
}
}
实例:
import java.awt.*;
import javax.swing.*;
import javax.swing.JSplitPane;
import java.awt.dnd.*;
//文本的拖动处理
public class DragTextDemo extends JFrame{
public DragTextDemo(){
super("文本的拖动处理"); //调用父类构造函数
String[] data = {"one", "two", "three", "four"}; //字符数组,用于构造列表框
DragList list=new DragList(data); //列表框实例
JTextArea jta=new JTextArea(8,20); //文本框实例
DragLabel label=new DragLabel("拖动目标"); //标签实例
jta.setLineWrap(true); //设置自动换行
jta.setDragEnabled(true); //文本框可拖动
new DropTarget(label,DnDConstants.ACTION_COPY,label); //实例化拖动目标为标签
Container container=getContentPane(); //得到容器
JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); //实例化分隔面板
split.setDividerLocation(140); //设置分隔位置
split.add(list); //增加组件到分隔面板
split.add(jta);
container.add(split,BorderLayout.CENTER); //增加组件到容器上
container.add(label,BorderLayout.SOUTH);
setSize(300,150); //设置窗口尺寸
setVisible(true); //设置窗口为可视
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序
}
public static void main(String[] args){
new DragTextDemo();
}
}
效果图: