2

首先,我只想承认我不是最敏锐的 Java 开发人员。我的优势/经验主要是在 JavaScript 等浏览器中。

我被要求创建一个可用于将文件拖放到浏览器 (IE7) 中的小程序。那没问题。我从这里使用了 FileDrop 类。

所以我们即将上线,但客户端在向用户池展示应用程序后决定,应用程序需要能够将文件拖出界面并进入 Windows 资源管理器/桌面等。 .

用户界面的设置方式是它们在右侧的内容窗格中有一个文件列表,在左侧有一个导航区域 - 目录树等,当用户单击时,他们会得到一个文件列表在内容区。当用户单击并按住鼠标时,小程序最终会与它下载的文件一起出现,并且用户单击以将该文件拖出界面并拖入 UI 中的另一个放置目标或拖出到 Windows 资源管理器等。

以下是小程序中的一些代码:

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 上的目标中。我已经 sysouted 文件的 .getCannonicalPath() ,一切似乎都指向我正在拖出文件的概念,但系统似乎没有认识到这一点。我看过这个问题:

从 Java 拖放到 Windows 资源管理器

但是我使用的是JList的内置拖放功能,我不知道如何更改mimetype。我需要编写自己的 TransferHandler 吗?如果是这样,它需要做什么?

4

1 回答 1

1

我最终从这个问题的最佳答案中复制了这段代码: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());
于 2013-05-02T19:06:26.860 回答