首先,我只想承认我不是最聪明的Java开发人员。我的长处/经验主要来自JavaScript等浏览器。
我被要求创建一个可用于将文件拖放到浏览器(IE7)中的applet。那没问题。我使用了here中的FileDrop类。
因此,我们即将上线,但是客户端在将应用程序显示给一组用户之后决定,该应用程序需要能够将文件拖出界面并拖到Windows资源管理器/桌面等中。 。
设置UI的方式是,它们在右侧的内容窗格中具有文件列表,而左侧则具有导航区域-目录树等,当用户单击时,它们会获得文件列表在内容区域。当用户单击并按住鼠标时,小程序最终会与已下载的文件一起出现,并且用户单击以将该文件拖出界面,并拖到UI中的另一个放置目标中,或拖到Windows资源管理器中,等等。
这是来自applet的一些代码:
public MyFileDrop() {
panel = new JPanel();
panel.setLayout(new GridBagLayout());
panel.setBorder(BorderFactory.createLineBorder(Color.gray, 1));
panel.setBackground(new Color(245, 245, 245));
JLabel label = new JLabel("+", JLabel.CENTER);
label.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 15));
label.setForeground(Color.gray);
panel.add(label);
DefaultListModel model = new DefaultListModel();
fileList = new JList(model);
fileList.setDragEnabled(true);
fileList.setSize(250, 25);
panel.add(fileList);
panel.addMouseListener(new MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
System.out.println("mouseEntered");
File file = self.getAndSaveLocalFile(self.documentUrl, self.name, self.id);
if (!file.isDirectory())
((DefaultListModel) ((JList) panel.getComponent(1)).getModel()).addElement(file);
}
...
当我将文件拖到Windows资源管理器窗口中时,它会显示一个斜线图像(例如,“不吸烟”而不带烟)。而且它也不会掉入UI的目标中。我已经对文件的.getCannonicalPath()进行了系统配置,似乎所有内容都指向我正在将文件拖出的概念,但是系统似乎无法识别这一点。我看了这个问题:
DragNDrop from Java to Windows Explorer
但是我正在使用JList的内置拖放功能,而且我不知道如何更改mimetype。我需要编写自己的TransferHandler吗?如果是这样,它到底需要做什么?
最佳答案
我最终从以下问题的最佳答案中复制了此代码:Swing application -> Drag & drop to the desktop / folder
private class FileTransferHandler extends TransferHandler {
@Override
protected Transferable createTransferable(JComponent c) {
JList list = (JList) c;
List<File> files = new ArrayList<File>();
for (Object obj: list.getSelectedValues()) {
files.add((File)obj);
}
return new FileTransferable(files);
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
}
private class FileTransferable implements Transferable {
private List<File> files;
public FileTransferable(List<File> files) {
this.files = files;
}
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DataFlavor.javaFileListFlavor};
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.javaFileListFlavor);
}
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (!isDataFlavorSupported(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return files;
}
}
然后像这样在JList上设置TransferHandler:
DefaultListModel model = new DefaultListModel();
JList fileList = new JList(model);
fileList.setDragEnabled(true);
fileList.setTransferHandler(new FileTransferHandler());