2012-10-04 6 views
7

Para una aplicación Swing simple para combinar archivos PDF con Apache PDFBox estoy usando un JFileChooser para seleccionar uno o varios archivos PDF y agregarlos a un JList. Sin problemas hasta el momento.Borrar la selección de JFileChooser después de agregar archivos a una JList

Lo que me molesta es que la selección anterior persiste en el JFileChooser cuando hago clic en el botón para agregar otro archivo/archivos de nuevo, no quiero esto, la selección debería estar inicialmente vacía.

He intentado esto, pero ni obras ni se emite una excepción:

pdfFileChooser.setSelectedFile(null); 

Este es el código correspondiente:

pdfFileChooser.setAcceptAllFileFilterUsed(false); 
    pdfFileChooser.setMultiSelectionEnabled(true); 
    pdfFileChooser.setFileFilter(new FileFilter() { 

     @Override 
     public boolean accept(File arg0) { 
      return arg0.getName().endsWith(".pdf"); 
     } 
     @Override 
     public String getDescription() { 
      return "*.pdf"; 
     } 
    }); 

    JButton btnAddFile = new JButton("Add file"); 
    btnAddFile.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if(pdfFileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { 
      addFileToList(pdfFileChooser.getSelectedFiles()); 
      pdfFileChooser.setSelectedFile(null); 
      } 
     } 
    }); 

    private void addFileToList(File[] filesToAdd) { 
     if((filesToAdd != null) && (filesToAdd.length > 0)) { 
      DefaultListModel model = (DefaultListModel)listFiles.getModel(); 
      for(File file : filesToAdd) { 
      if(!model.contains(file)) { 
       model.addElement(file);     
      } 
      } 
     } 
    } 

¿Cómo puedo eliminar la selección de la JFileChooser así que no hay archivos/archivos es/son inicialmente seleccionados?

Respuesta

9

Esto es, en mi humilde opinión, un error .

(Como se ha señalado amablemente, "error" podría ser una palabra fuerte, ya que la API no establece lo que sucedería si pasó nulo al método selectedFile. En su lugar, es probablemente más razonable sugerir que es una característica que falta)

intentar algo como esto ...

JFileChooser fc = new JFileChooser(); 
fc.showOpenDialog(null); 
File selected = fc.getSelectedFile(); 
System.out.println("You selected " + selected); 

File currentDirectory = fc.getCurrentDirectory(); 
// Hack alert 
fc.setSelectedFile(new File("")); 
fc.setCurrentDirectory(currentDirectory); 

fc.showOpenDialog(null); 
selected = fc.getSelectedFile(); 

System.out.println("You selected " + selected); 

Básicamente, el cambio del archivo seleccionado parece ser dependiente de la interfaz de usuario y se basa en el evento de cambio SELECTED_FILE_CHANGED_PROPERTY propiedad. Lo que parece suceder es que está ignorando una referencia null cuando se trata de cambiar (en particular) el campo de texto del archivo seleccionado.

Probé esto utilizando la mirada del metal y Windows y se sienten

+2

+1 El error puede ser que no hay una forma explícita de borrar las selecciones actuales. Uno podría esperar que pasar null lo haría, pero la API claramente no especifica ese comportamiento. No hay mención de borrar las selecciones actuales en cualquier lugar que pueda encontrar. –

+2

@Jim estuvo de acuerdo, no hay nada en los documentos que sugiera lo que pasaría si pasa un 'nulo' al método' setSelectedFile' – MadProgrammer

+0

Bueno, esto funciona, gracias :) Es suficiente para hacer esto: 'Archivo currentDirectory = fc.getCurrentDirectory(); // Hack alert fc.setSelectedFile (new File ("")); fc.setCurrentDirectory (currentDirectory); ' – devrys

1

Esto funciona:

fileChooser.setSelectedFile(new File("")); 
fileChooser.setSelectedFiles(new File[]{new File("")}); 

Pero si quieres una alternativa más rápida, en caso de que haya seleccionado más de 10K archivos (el código caducos toma mucho tiempo).

fileChooser.setSelectedFile(new File("")); 
((FilePane) fileChooser.getComponents()[2]).clearSelection(); 
0

Solo crearía una nueva instancia de JFileChooser y le pasaría el último directorio usado. El directorio utilizado por última vez se establece de manera predeterminada en el directorio principal, y cuando selecciona un archivo válido, almacena el directorio de ese archivo y lo usa la próxima vez que abra un nuevo JFileChooser.

Cuestiones relacionadas