2013-04-30 2 views
2

Сначала я просто хочу признать, что я не самый острый разработчик Java. Мои сильные стороны/опыт - это в основном браузеры JavaScript и т. Д.Перетаскивание файла из JList в окно проводника Windows

Меня попросили создать апплет, который можно использовать для перетаскивания файлов в браузер (IE7). Это не проблема. Я использовал класс FileDrop от here.

Итак, мы собираемся отправиться в прямом эфире, но клиент решил показать приложение в пуле пользователей, что приложение должно иметь возможность перетаскивать файлы из интерфейса и в проводник/рабочий стол Windows и т. Д. . Такие вещи.

Способ настройки пользовательского интерфейса: у них есть список файлов в области содержимого справа, а область навигации слева - дерево каталогов и т. Д., Которые, когда пользователь нажимает, получают список файлов в области содержимого. Когда пользователь нажимает и удерживает мышь, апплет в конечном итоге появляется с загруженным им файлом, и пользователь щелкает, чтобы перетащить этот файл из интерфейса и в другой целевой объект в пользовательском интерфейсе или в проводник 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, это дает мне круг слэш изображение (то есть, как «не-курения» без сигареты). И он не попадает в цели в пользовательском интерфейсе. Я передал файл .getCannonicalPath() файла, и все, кажется, указывает на то, что я перетаскиваю файл, но система, похоже, не распознает это. Я посмотрел на этот вопрос:

DragNDrop from Java to Windows Explorer

Но я использую встроенный в перетащить и падение особенность JList, и я не знаю, как изменить MimeType. Нужно ли мне писать собственный TransferHandler? Если да, то что нужно делать именно так?

+0

И ..what ЯВЛЯЕТСЯ ВАШЕЙ вопрос? –

+0

нажмите 'ctrl-f' и введите символ'? ', И в зависимости от того, какой браузер вы используете, вам может понадобиться или не нужно нажать' enter'. Кроме того, прокрутите страницу до конца и прочитайте последние два предложения. – tjb1982

ответ

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; 
    } 
} 

, а затем я поставил TransferHandler на JList вроде этого:

DefaultListModel model = new DefaultListModel(); 
JList fileList = new JList(model); 
fileList.setDragEnabled(true); 
fileList.setTransferHandler(new FileTransferHandler()); 
Смежные вопросы