Java从JVM拖到本地系统拖拽实现 比如我用java写了一个文件列表,将该文件列表中某个文件拖拽到本地系统桌面,该如何实现?当然这个文件列表也许是服务器上某个文件夹中的文件列表,拖拽发生时,将服务器上的文件拷贝到本地。现在存在的一个问题是,从jvm也就是java开发的一个程序中拖拽到本地目录,java是否能捕获这个事件进行操作?是否可以获取到拖拽操作释放时,本地目录? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以实现啊,你去看下Extjs里面的部分代码,它有拖拽功能来着,只要监听点击和释放,然后根据选中的目录去读写文件就是。 你可以看看 O'Reilly Swing Hacks这本书的第九章 创建一个类继承TransferHandler如果要drop,必须实现importData,canImport方法,如果是drag,实现getSourceActions,createTransferable,exportDone,调用JList的setTransferHandler设置为上述的继承类,以下是源码,服务器的文件没试过。package dnd;import java.awt.BorderLayout;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.swing.DefaultListModel;import javax.swing.DropMode;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.TransferHandler;public class FileListDropTransferHandler extends TransferHandler { /** * drop进行数据加载 */ @Override public boolean importData(TransferSupport support) { if (!canImport(support)) { return false; } JList fileList = (JList) support.getComponent(); DefaultListModel listModel = (DefaultListModel) fileList.getModel(); List<File> transferData = null; try { Transferable transferable = support.getTransferable(); transferData = (List<File>) transferable .getTransferData(DataFlavor.javaFileListFlavor); } catch (UnsupportedFlavorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (support.isDrop()) { for (File file : transferData) { JList.DropLocation dropLocation = (javax.swing.JList.DropLocation) support .getDropLocation(); int index = dropLocation.getIndex(); if (dropLocation.isInsert()) { listModel.add(index, file); } else { listModel.set(index, file); } } } else { int i = 0; for (File file : transferData) { int selectedIndex = fileList.getSelectedIndex(); if (selectedIndex >= 0) { i++; listModel.add(selectedIndex + i, file); } else { listModel.addElement(file); } } } return true; } /** * drop只接收文件数据 */ @Override public boolean canImport(TransferSupport support) { if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return false; } return true; } /** * 设置drag方式是复制还是剪切 */ @Override public int getSourceActions(JComponent c) { return COPY_OR_MOVE; } /** * 打包数据 */ @Override protected Transferable createTransferable(JComponent c) { JList list = (JList) c; List<File> files = new ArrayList<File>(); Object[] selectedValues = list.getSelectedValues(); Object value = list.getSelectedValue(); for (Object object : selectedValues) { files.add((File) object); } return new FileListSelection((File) value); } /** * drag完成后的操作 */ @Override protected void exportDone(JComponent source, Transferable data, int action) { if (!(action == MOVE)) { return; } JList list = (JList) source; DefaultListModel listModel = (DefaultListModel) list.getModel(); listModel.remove(list.getSelectedIndex()); } /** * 传输数据的包装类 * * @author Administrator * */ class FileListSelection implements Transferable { DataFlavor[] flavors = { DataFlavor.javaFileListFlavor }; // File file; List<File> files = new ArrayList<File>(); public FileListSelection(File file) { super(); files.add(file); } public FileListSelection(List<File> files) { super(); files.addAll(files); } @Override public DataFlavor[] getTransferDataFlavors() { return flavors; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(DataFlavor.javaFileListFlavor); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return (Object) files; } return null; } } public static void main(String[] args) { JList list = new JList(); // 可以drag list.setDragEnabled(true); // 设置TransferHandler list.setTransferHandler(new FileListDropTransferHandler()); DefaultListModel model = new DefaultListModel(); list.setModel(model); // drop插入和覆盖均可 list.setDropMode(DropMode.ON_OR_INSERT); JScrollPane pane = new JScrollPane(list); JFrame frame = new JFrame(); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(pane, BorderLayout.CENTER); frame.setSize(640, 480); frame.setVisible(true); }} Java的UI设计,radionButton控件问题 Java 类编译原理的问题 通用数据库操作"窗口" 类 这段代码不知道是什么意思 vector 如何 (过滤)filter java有没有类似c中的outportb端口操作的函数,怎么用? 打印票据的问题 谁能介绍一下JAVA的基础概念,J2EE/J2SE/EJB/JMS等等,非常感谢 ~~~~100000(十万分)求救~如何判断有几个用户在使用这个文件 如图 为什么设了个i j就能这样输出菱形啊?求解 关于在txt文本中的字符串的替换问题 java如何获得某个方法的注释
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.swing.DefaultListModel;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.TransferHandler;public class FileListDropTransferHandler extends TransferHandler { /**
* drop进行数据加载
*/
@Override
public boolean importData(TransferSupport support) {
if (!canImport(support)) {
return false;
} JList fileList = (JList) support.getComponent();
DefaultListModel listModel = (DefaultListModel) fileList.getModel();
List<File> transferData = null;
try {
Transferable transferable = support.getTransferable();
transferData = (List<File>) transferable
.getTransferData(DataFlavor.javaFileListFlavor);
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (support.isDrop()) {
for (File file : transferData) {
JList.DropLocation dropLocation = (javax.swing.JList.DropLocation) support
.getDropLocation();
int index = dropLocation.getIndex();
if (dropLocation.isInsert()) {
listModel.add(index, file);
} else {
listModel.set(index, file);
}
}
} else {
int i = 0;
for (File file : transferData) {
int selectedIndex = fileList.getSelectedIndex();
if (selectedIndex >= 0) {
i++;
listModel.add(selectedIndex + i, file);
} else {
listModel.addElement(file);
}
}
} return true;
} /**
* drop只接收文件数据
*/
@Override
public boolean canImport(TransferSupport support) {
if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
return false;
}
return true;
} /**
* 设置drag方式是复制还是剪切
*/
@Override
public int getSourceActions(JComponent c) {
return COPY_OR_MOVE;
} /**
* 打包数据
*/
@Override
protected Transferable createTransferable(JComponent c) {
JList list = (JList) c;
List<File> files = new ArrayList<File>();
Object[] selectedValues = list.getSelectedValues();
Object value = list.getSelectedValue(); for (Object object : selectedValues) {
files.add((File) object);
}
return new FileListSelection((File) value);
} /**
* drag完成后的操作
*/
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
if (!(action == MOVE)) {
return;
}
JList list = (JList) source;
DefaultListModel listModel = (DefaultListModel) list.getModel();
listModel.remove(list.getSelectedIndex());
} /**
* 传输数据的包装类
*
* @author Administrator
*
*/
class FileListSelection implements Transferable { DataFlavor[] flavors = { DataFlavor.javaFileListFlavor };
// File file;
List<File> files = new ArrayList<File>(); public FileListSelection(File file) {
super();
files.add(file);
} public FileListSelection(List<File> files) {
super();
files.addAll(files);
} @Override
public DataFlavor[] getTransferDataFlavors() {
return flavors;
} @Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.javaFileListFlavor);
} @Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (isDataFlavorSupported(flavor)) {
return (Object) files;
}
return null;
} } public static void main(String[] args) {
JList list = new JList();
// 可以drag
list.setDragEnabled(true);
// 设置TransferHandler
list.setTransferHandler(new FileListDropTransferHandler());
DefaultListModel model = new DefaultListModel();
list.setModel(model);
// drop插入和覆盖均可
list.setDropMode(DropMode.ON_OR_INSERT); JScrollPane pane = new JScrollPane(list); JFrame frame = new JFrame(); frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(pane, BorderLayout.CENTER); frame.setSize(640, 480);
frame.setVisible(true);
}}