Java Swing GUI文件拖拽

      为了方便,有时我们需要直接将本地文件或字符或图片直接拖拽到图形上,让组件自动打开拖拽的文件。基于这种思想,我写了如下代码实现这个拖拽监听的功能。

      1.UI源码

package ibees.desktop; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.WindowConstants; /** * * @author zhang xiaojin * 演示Swing文件拖拽 */ public class DropDragDemo { public static void main(String[] args){ JFrame frame = new JFrame("文件拖拽Demo"); frame.setSize(500, 400); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder("文件拖拽演示")); JTextArea textArea = new DropDragSupportTextArea(); JScrollPane jsp = new JScrollPane(); jsp.setViewportView(textArea); textArea.setColumns(40); textArea.setRows(20); panel.add(jsp); frame.add(panel); frame.setVisible(true); } }  

 这段源码的效果如下:里面的两个文件名是我拖拽进去的。

Java Swing GUI文件拖拽_第1张图片

  2.实现监听的类

package ibees.desktop; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.JTextArea; /** * * @author Administrator */ public class DropDragSupportTextArea extends JTextArea implements DropTargetListener{ private DropTarget dropTarget; public DropDragSupportTextArea() { //注册DropTarget,并将它与组件相连,处理哪个组件的相连 //即连通组件(第一个this)和Listener(第二个this) dropTarget = new DropTarget(this,DnDConstants.ACTION_COPY_OR_MOVE, this, true); } /** * 拖入文件或字符串,这里只说明能拖拽,并未打开文件并显示到文本区域中 */ public void dragEnter(DropTargetDragEvent dtde) { DataFlavor[] dataFlavors = dtde.getCurrentDataFlavors(); if(dataFlavors[0].match(DataFlavor.javaFileListFlavor)){ try { Transferable tr = dtde.getTransferable(); Object obj = tr.getTransferData(DataFlavor.javaFileListFlavor); List files = (List)obj; for(int i = 0; i < files.size(); i++){ append(files.get(i).getAbsolutePath()+"/r/n"); } } catch (UnsupportedFlavorException ex) { } catch (IOException ex) { } } } public void dragOver(DropTargetDragEvent dtde) { } public void dropActionChanged(DropTargetDragEvent dtde) { } public void dragExit(DropTargetEvent dte) { } public void drop(DropTargetDropEvent dtde) { } }   

这个类的主要作用是将监听器和组件关联起来。

 

支持二个类联合就可以实现拖拽了。

你可能感兴趣的:(Java)