2012-02-08 13 views
7

Permítanme comenzar diciendo que he estado leyendo el drag'n drop tutorial y preguntas similares en SO, pero desafortunadamente solo me he confundido más acerca de este asunto. Lo que quiero lograr es relativamente simple, así que estoy sorprendido de que ya me haya metido en tantos problemas. Estoy escribiendo una pequeña aplicación de utilidad que consolidará un grupo de archivos de resultados (tipo xml definido a medida) en un archivo de texto separado por pestañas. La mayoría de la funcionalidad ya está codificada, sin embargo, quería hacer una GUI decente para ello.Arrastrar archivos desde el sistema operativo a la aplicación Java (Swing)

Lo que quiero es poder arrastrar y soltar archivos en un componente (por ejemplo JTextArea) de una manera agradable y elegante (léase: rutas no completas, sino un pequeño icono y nombre). Me gustaría poder proporcionar un JFileChooser para buscar también archivos. Luego analizaré los archivos secuencialmente para producir la matriz que quiero.

Lo que he aprendido hasta ahora es que el framework ya está allí, sin embargo, cualquier funcionalidad adicional debe ser personalizada. He creado una GUI de prueba en Netbeans e intenté arrastrar un grupo de archivos a un JTextArea, pero aparecen como rutas de archivos, y ciertamente se ve muy feo.

Realmente agradecería cualquier consejo y orientación sobre cómo resolver (o aclarar) este problema de una manera ordenada. Tenga en cuenta que tengo la intención de utilizar el software en múltiples SO diferentes (Mac, Win y Linux).

EDIT: el código que tengo hasta ahora se basa en uno de los ejemplos de tutoriales de Sun y es el siguiente

import java.awt.datatransfer.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.text.*; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    JFileChooser fc; 
    JButton clear; 
    JTextArea dropZone, console; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
    super(new BorderLayout()); 

    fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);    


    JPanel fcPanel = new JPanel(new BorderLayout()); 
    fcPanel.add(fc, BorderLayout.CENTER); 

    clear = new JButton("Clear All"); 
    clear.addActionListener(this); 
    JPanel buttonPanel = new JPanel(new BorderLayout()); 
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    buttonPanel.add(clear, BorderLayout.LINE_END); 

    JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
    leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
    leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 


    JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
    leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    dropZone = new JTextArea(); 
    dropZone.setColumns(20); 
    dropZone.setLineWrap(true); 
    dropZone.setRows(5); 
    dropZone.setDragEnabled(true); 
    dropZone.setDropMode(javax.swing.DropMode.INSERT); 
    dropZone.setBorder(new TitledBorder("Selected files/folders")); 
    leftLowerPanel.setViewportView(dropZone); 

    childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
      leftUpperPanel, leftLowerPanel); 
    childSplitPane.setDividerLocation(400); 
    childSplitPane.setPreferredSize(new Dimension(480, 650)); 

    console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650)); 

    add(parentSplitPane, BorderLayout.CENTER); 

} 

public void setDefaultButton() { 
    getRootPane().setDefaultButton(clear); 
} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == clear) { 
     dropZone.setText(""); 

    } 
} 

/** 
* Create the GUI and show it. For thread safety, 
* this method should be invoked from the 
* event-dispatching thread. 
*/ 
private static void createAndShowGUI() { 
    //Make sure we have nice window decorations. 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    try { 
     //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    //Create and set up the window. 
    JFrame frame = new JFrame("Consolidator!"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    //Create and set up the menu bar and content pane. 
    ConsolidatorDemo demo = new ConsolidatorDemo(); 
    demo.setOpaque(true); //content panes must be opaque 
    frame.setContentPane(demo); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    demo.setDefaultButton(); 
} 

public static void main(String[] args) { 
    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
+0

Bueno, sí, tal vez no hice la pregunta clara; "¿Cómo hago para agregar una función de arrastrar y soltar a mi GUI, donde los archivos arrastrados se representan bien con sus nombres de archivo y un pequeño icono (los iconos del sistema harían, no tengo intención de diseñar íconos personalizados)?" He llegado a decir que los archivos DnD'd están representados con sus rutas (que creo que es más o menos el comportamiento predeterminado). – posdef

+0

Gracias por recordar, código agregado ahora. – posdef

+1

¿por qué un area de texto como dropZone? Yo usaría una lista con un renderizador personalizado (mostrando el icono/displayName provisto por FileSystemView) – kleopatra

Respuesta

9

He aquí un fragmento rápida para importar los archivos reales en un JList (en contraposición para importar su representación de cadena en un componente de texto) y usar un renderizador personalizado para presentarlo correctamente. Es una adaptación de la BasicDnD (en el tutorial):

fileDropper = new JList(new DefaultListModel()); 
    fileDropper.setDragEnabled(true); 
    leftLowerPanel.setViewportView(fileDropper); 

    TransferHandler handler = new TransferHandler() { 

     @Override 
     public boolean canImport(TransferHandler.TransferSupport info) { 
      // we only import FileList 
      if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public boolean importData(TransferHandler.TransferSupport info) { 
      if (!info.isDrop()) { 
       return false; 
      } 

      // Check for FileList flavor 
      if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       displayDropLocation("List doesn't accept a drop of this type."); 
       return false; 
      } 

      // Get the fileList that is being dropped. 
      Transferable t = info.getTransferable(); 
      List<File> data; 
      try { 
       data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
      } 
      catch (Exception e) { return false; } 
      DefaultListModel model = (DefaultListModel) fileDropper.getModel(); 
      for (File file : data) { 
       model.addElement(file); 
      } 
      return true; 
     } 

     private void displayDropLocation(String string) { 
      System.out.println(string); 
     } 
    }; 
    fileDropper.setTransferHandler(handler); 
    fileDropper.setCellRenderer(new DefaultListRenderer(
      StringValues.FILE_NAME, IconValues.FILE_ICON)); 

no pudo resistirse a mostrar SwingX :-) procesador de configuración en Java central, que podría hacerlo de forma manual, algo así como

class MyRenderer extends DefaultListCellRenderer { 

     @Override 
     public Component getListCellRendererComponent(...) { 
      super.getList... 
      if (value instanceof File) { 
       setText(FileSystemView.getFileSystemView().getDisplayName(value); 
       setIcon(FileSystemView.getFileSystemView().getSystemIcon(value); 
      } 
      return this; 
     } 

    } 
+0

Gracias por el ejemplo. Supongo que el último bit con 'MyRenderer' se supone que está en el lugar de' fileDropper.setCellRenderer (nuevo DefaultListRenderer (StringValues.FILE_NAME, IconValues.FILE_ICON)); 'Viendo como' StringValues.FILE_NAME', y 'IconValues. FILE_ICON' no están definidos/no se pueden resolver? ¿O he entendido mal algo? – posdef

+0

Incorporé algunos de esos puntos en su SSCCE (y los publiqué como respuesta). –

7

Este es efectivamente la respuesta de Kleopatra (con algunos cambios triviales, no necesariamente para mejor), ..con una captura de pantalla!

ConsolidatorDemo

import java.awt.datatransfer.*; 
import java.awt.event.*; 
import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.filechooser.FileSystemView; 
import javax.swing.text.*; 
import java.util.List; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    JFileChooser fc; 
    JButton clear; 
    JTextArea console; 

    JList dropZone; 
    DefaultListModel listModel; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
    super(new BorderLayout()); 

    fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY); 


    JPanel fcPanel = new JPanel(new BorderLayout()); 
    fcPanel.add(fc, BorderLayout.CENTER); 

    clear = new JButton("Clear All"); 
    clear.addActionListener(this); 
    JPanel buttonPanel = new JPanel(new BorderLayout()); 
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    buttonPanel.add(clear, BorderLayout.LINE_END); 

    JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
    leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
    leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 

    JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
    leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 

    listModel = new DefaultListModel(); 
    dropZone = new JList(listModel); 
    dropZone.setCellRenderer(new FileCellRenderer()); 
    dropZone.setTransferHandler(new ListTransferHandler(dropZone)); 
    dropZone.setDragEnabled(true); 
    dropZone.setDropMode(javax.swing.DropMode.INSERT); 
    dropZone.setBorder(new TitledBorder("Selected files/folders")); 
    leftLowerPanel.setViewportView(new JScrollPane(dropZone)); 

    childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
      leftUpperPanel, leftLowerPanel); 
    childSplitPane.setDividerLocation(400); 
    childSplitPane.setPreferredSize(new Dimension(480, 650)); 

    console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650)); 

    add(parentSplitPane, BorderLayout.CENTER); 

} 

public void setDefaultButton() { 
    getRootPane().setDefaultButton(clear); 
} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == clear) { 
     listModel.clear(); 
    } 
} 

/** 
* Create the GUI and show it. For thread safety, 
* this method should be invoked from the 
* event-dispatching thread. 
*/ 
private static void createAndShowGUI() { 
    //Make sure we have nice window decorations. 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    try { 
     //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    //Create and set up the window. 
    JFrame frame = new JFrame("Consolidator!"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    //Create and set up the menu bar and content pane. 
    ConsolidatorDemo demo = new ConsolidatorDemo(); 
    demo.setOpaque(true); //content panes must be opaque 
    frame.setContentPane(demo); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    demo.setDefaultButton(); 
} 

public static void main(String[] args) { 
    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

class FileCellRenderer extends DefaultListCellRenderer { 

    public Component getListCellRendererComponent(JList list, 
     Object value, 
     int index, 
     boolean isSelected, 
     boolean cellHasFocus) { 

     Component c = super.getListCellRendererComponent(
      list,value,index,isSelected,cellHasFocus); 

     if (c instanceof JLabel && value instanceof File) { 
      JLabel l = (JLabel)c; 
      File f = (File)value; 
      l.setIcon(FileSystemView.getFileSystemView().getSystemIcon(f)); 
      l.setText(f.getName()); 
      l.setToolTipText(f.getAbsolutePath()); 
     } 

     return c; 
    } 
} 

class ListTransferHandler extends TransferHandler { 

    private JList list; 

    ListTransferHandler(JList list) { 
     this.list = list; 
    } 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // we only import FileList 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     if (!info.isDrop()) { 
      return false; 
     } 

     // Check for FileList flavor 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      displayDropLocation("List doesn't accept a drop of this type."); 
      return false; 
     } 

     // Get the fileList that is being dropped. 
     Transferable t = info.getTransferable(); 
     List<File> data; 
     try { 
      data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
     } 
     catch (Exception e) { return false; } 
     DefaultListModel model = (DefaultListModel) list.getModel(); 
     for (Object file : data) { 
      model.addElement((File)file); 
     } 
     return true; 
    } 

    private void displayDropLocation(String string) { 
     System.out.println(string); 
    } 
} 
  1. yo estaba ocupado escribiendo una respuesta cuando me di cuenta de que ya había publicado uno. Como mi TransferHandler estaba muy roto, usé el suyo. Aunque usé mi versión del renderizador de la celda de la lista, que no parece captar la sutileza de lo que ella estaba sugiriendo. También recibí errores de compilación con la mención de List (dado que el compilador suponía que me refería a una lista AWT. Solo me di cuenta de lo que estaba sucediendo después de haber cambiado varias de las declaraciones de tipo List<File> para que no fueran genéricas, creo que la mayoría ellos ahora han cambiado.
+0

Gracias a un gran grupo Andrew, funciona sin problemas por mi parte. (Ya había encontrado el problema con 'List's cuando estaba probando su ejemplo). No estoy seguro de entender por completo la sugerencia 'ListCellRenderer' de @ kleopatra. Quiero decir que sigo tu versión, pero no creo entender completamente la delicadeza de su versión. – posdef

+0

Era principalmente 'FileSystemView.getFileSystemView(). GetDisplayName (value)' que sospecho que podría producir un mejor nombre (pero no se ha probado). Por cierto, si tiene problemas para decidir a quién darle el "tic", le sugiero su respuesta, ya que fue correcto y el primero. –

+0

Gracias por la aclaración, los pruebo para ver si hay una diferencia significativa. Siento que obtuve más ayuda de usted que ella, pero honraré su sugerencia, sin embargo. – posdef

0

Este es el código de la consola y sin botón extra

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.PrintStream; 
import java.util.List; 

import javax.swing.BorderFactory; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 
import javax.swing.TransferHandler; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileSystemView; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    // JFileChooser fc; 
    JButton clear,compare; 
    JTextArea fc; 

    JList dropZone; 
    DefaultListModel listModel; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
     super(new BorderLayout()); 

     /* fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);*/ 
     fc= new JTextArea(); 
     fc.setText("Rules:\n1. drop old html first.\n2. drop new html.\n3. drop output folder.\n4. click compare button.\n5. Check output in the output.txt file.\nEnd"); 

     fc.setEditable(false); 
     JPanel fcPanel = new JPanel(new BorderLayout()); 

     fcPanel.add(fc, BorderLayout.CENTER); 


     compare = new JButton("Compare"); 
     compare.addActionListener(this); 
     JPanel buttonPanel1 = new JPanel(new BorderLayout()); 
     buttonPanel1.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); 
     buttonPanel1.add(compare, BorderLayout.LINE_END); 


     clear = new JButton("Clear All"); 
     clear.addActionListener(this); 
     JPanel buttonPanel = new JPanel(new BorderLayout()); 
     buttonPanel.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); 
     buttonPanel.add(clear, BorderLayout.LINE_END); 

     JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
     leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3)); 
     leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
     leftUpperPanel.add(buttonPanel1, BorderLayout.LINE_END); 
     leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 

     JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
     leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3)); 

     listModel = new DefaultListModel(); 
     dropZone = new JList(listModel); 
     dropZone.setCellRenderer(new FileCellRenderer()); 
     dropZone.setTransferHandler(new ListTransferHandler(dropZone)); 
     dropZone.setDragEnabled(true); 
     dropZone.setDropMode(javax.swing.DropMode.INSERT); 
     dropZone.setBorder(new TitledBorder("Drag and drop files here")); 
     leftLowerPanel.setViewportView(new JScrollPane(dropZone)); 

     childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, leftLowerPanel,leftUpperPanel); 
     childSplitPane.setDividerLocation(200);//400 
     childSplitPane.setPreferredSize(new Dimension(300, 400));//480, 650 

     /*console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650));*/ 

     add(childSplitPane, BorderLayout.CENTER); 

    } 

    public void setDefaultButton() { 
     getRootPane().setDefaultButton(clear); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == clear) { 
      listModel.clear(); 
     }else if (e.getSource() == compare) { 
      //our function 
     } 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Make sure we have nice window decorations. 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     try { 
      //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

     //Create and set up the window. 
     JFrame frame = new JFrame("Bill of materials Comparer"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     //Create and set up the menu bar and content pane. 
     ConsolidatorDemo demo = new ConsolidatorDemo(); 
     demo.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(demo); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
     demo.setDefaultButton(); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

class FileCellRenderer extends DefaultListCellRenderer { 

    public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus) { 

     Component c = super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus); 

     if (c instanceof JLabel && value instanceof File) { 
      JLabel l = (JLabel)c; 
      File f = (File)value; 
      l.setIcon(FileSystemView.getFileSystemView().getSystemIcon(f)); 
      l.setText(f.getName()); 
      //l.setText(f.getAbsolutePath()); 
      l.setToolTipText(f.getAbsolutePath()); 
     } 

     return c; 
    } 
} 

class ListTransferHandler extends TransferHandler { 

    private JList list; 

    ListTransferHandler(JList list) { 
     this.list = list; 
    } 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // we only import FileList 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     if (!info.isDrop()) { 
      return false; 
     } 

     // Check for FileList flavor 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      displayDropLocation("List doesn't accept a drop of this type."); 
      return false; 
     } 

     // Get the fileList that is being dropped. 
     Transferable t = info.getTransferable(); 
     List<File> data; 
     try { 
      data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
     } 
     catch (Exception e) { return false; } 
     DefaultListModel model = (DefaultListModel) list.getModel(); 
     for (Object file : data) { 
      model.addElement((File)file); 
     } 
     return true; 
    } 

    private void displayDropLocation(String string) { 
     System.out.println(string); 
    } 
} 
Cuestiones relacionadas