至于这个问题,Java的awt.dnd包下提供了许多完成这一功能的类
例如DropTarget、DropTargetListener等
先来讲一下DropTarget类,这个类完成和拖拽、复制文件等操作和Component的关联
常用的构造方法有这些:
DropTarget(Component c, DropTargetListener dtl)
c:要与它关联的组件
dtl:执行事件处理的DropTargetListener
DropTarget(Component c, int ops, DropTargetListener dtl)
ops:默认的可接受操作
另外两个参数和上面是一样的
可接受的操作有哪些呢?DnDConstants类中有着下面几种操作(字段):
static int |
ACTION_COPY 表示“复制”操作的 int 值。 |
static int |
ACTION_COPY_OR_MOVE 表示“复制”或“移动”操作的 int 值。 |
static int |
ACTION_LINK 表示“链接”操作的 int 值。 |
static int |
ACTION_MOVE 表示“移动”操作的 int 值。 |
static int |
ACTION_NONE 表示无操作的 int 值。 |
static int |
ACTION_REFERENCE 表示“引用”操作的 int 值(等同于 ACTION_LINK)。 |
接着来谈谈DropTargetListener,API帮助文档中提供比较详细的说明,在这就不过多地介绍了,
如果只是单独的使用文件的拖拽,可以使用DropTargetAdapter这一个类,对于上面这个接口中
drop(DropTargetDropEvent)
以外的所有方法都定义了 null 实现,所以是实现接口的时候就比较方便
下面给出一个简单的接受拖拽文件的程序的源代码:
package 图形界面; import javax.swing.*; import java.util.List; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.*; import java.io.File; import java.io.IOException; /** * @author Administrator */ public class 拖拽文件 extends JFrame{ private static final long serialVersionUID = -3081282189290446349L; private JTextArea jta; private JScrollPane jsp; private void init_drop(){ new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetAdapter() { @Override public void drop(DropTargetDropEvent dtde) { if(dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){ //判断是否支持此文件的格式 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); //接受该文件 try { @SuppressWarnings("unchecked") List<File> list = (List<File>) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); jta.setText(jta.getText()+list.get(list.size() - 1).getAbsolutePath() + "\r\n"); } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } }else{ dtde.rejectDrop(); //拒绝该拖拽文件 } } }); } private void init(){ jta = new JTextArea(); jsp = new JScrollPane(jta); jsp.setBounds(30, 30, 200, 200); jta.setForeground(Color.green); jta.setRows(40); } public 拖拽文件(){ this.init(); this.setTitle("拖拽文件测试"); this.setLayout(null); this.add(jsp); this.init_drop(); this.setBounds(420, 280, 300, 320); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); } public static void main(String args[]){ new 拖拽文件(); } }