2013-04-30 49 views
2

首先,我只是想承認我不是最清晰的Java開發人員在那裏。我的優勢/經驗主要來自JavaScript等瀏覽器。從一個JList拖動文件到Windows資源管理器窗口

我一直要求創建可用於拖動/文件拖放到瀏覽器(IE7)的小程序。這沒有問題。我用FileDrop類從here

因此,我們即將上線,但客戶端在嚮應用程序池顯示應用程序需要能夠將文件拖出界面並進入Windows資源管理器/桌面等之後決定。 之類的事情。

的UI設置的方式是他們在正確的內容窗格的文件列表,以及一個導航區域的左邊 - 目錄樹等,當用戶點擊,他們得到內容區域中的文件列表。當用戶點擊並按住鼠標下來,小程序最終與已下載的文件出現,用戶點擊拖動文件出接口,併到另一個放置目標在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(),一切似乎指向的是我將文件拖動出來的概念,但系統似乎並沒有認識到這一點。我看這個問題:

DragNDrop from Java to Windows Explorer

但我使用的JList的內置拖放功能,我不知道如何改變MIME類型。我是否需要編寫自己的TransferHandler?如果是這樣,它需要做什麼?

+0

而..what是你的題? – 2013-05-01 13:10:11

+0

按下'ctrl-f'並輸入'?'字符,並根據您使用的瀏覽器可能需要也可能不需要按'enter'。或者,滾動到帖子的底部並閱讀最後兩個句子。 – tjb1982 2013-05-01 14:26:55

回答

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()); 
相關問題