2010-09-06 18 views
35

Estoy trabajando en un programa que carga y guarda datos de archivos de texto, y le pido al usuario un nombre de archivo con JFileChooser al cargar y guardar.JFileChooser con diálogo de confirmación

Esta pregunta es sobre el guardar diálogo: new JFileChooser().showSaveDialog();. El usuario podría sobrescribir un archivo existente sin ninguna advertencia, y eso sería un problema.

¿Alguna sugerencia sobre cómo solucionar esto? He estado buscando algún método u opción, pero no encontré nada.

Gracias de antemano.

Respuesta

71

Gracias por las respuestas, pero he encontrado otra solución, anulando el approveSelection() de la JFileChooser, de esta manera:

JFileChooser example = new JFileChooser(){ 
    @Override 
    public void approveSelection(){ 
     File f = getSelectedFile(); 
     if(f.exists() && getDialogType() == SAVE_DIALOG){ 
      int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION); 
      switch(result){ 
       case JOptionPane.YES_OPTION: 
        super.approveSelection(); 
        return; 
       case JOptionPane.NO_OPTION: 
        return; 
       case JOptionPane.CLOSED_OPTION: 
        return; 
       case JOptionPane.CANCEL_OPTION: 
        cancelSelection(); 
        return; 
      } 
     } 
     super.approveSelection(); 
    }   
} 

espero que esto podría ser útil para otra persona.

+0

¡Me ha ayudado! Hice lo mismo que tú pero tuve problemas para cerrar el cuadro de diálogo después de que un usuario eligió una opción. La "super.approveSelection()" me ayudó. Gracias – prolink007

+0

Para showSaveDialog, debe manejar la extensión del archivo seleccionado. – onurbaysan

3

Comprobar antes de guardar si el mismo archivo ya existe, entonces pedir la confirmación del usuario hace que realmente quiere anular: p

JDialog.setDefaultLookAndFeelDecorated(true); 
    int response = JOptionPane.showConfirmDialog(null, "Are you sure you want to override existing file?", "Confirm", 
     JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
    if (response == JOptionPane.NO_OPTION) { 
     System.out.println("No button clicked"); 
    } else if (response == JOptionPane.YES_OPTION) { 
     System.out.println("Yes button clicked"); 
    } else if (response == JOptionPane.CLOSED_OPTION) { 
     System.out.println("JOptionPane closed"); 
    } 

here es el código

Para comprobar archivo ya existe utilizar

boolean exists = (new File("filename")).exists(); 
if (exists) { 
    // File or directory exists 
} else { 
    // File or directory does not exist 
} 
1

Escribí esto basado en su propia respuesta. Publicada en caso de que alguien le resulta útil:

final JFileChooser exportFileChooser = new JFileChooser(); 
exportFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
exportFileChooser.setApproveButtonText("Export"); 

final JButton exportButton = new JButton("Export text file"); 
exportButton.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     int returnVal = exportFileChooser.showSaveDialog(exportButton 
       .getParent()); 

     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      File outputFile = exportFileChooser.getSelectedFile(); 
      if (outputFileIsValid(outputFile)) { 
       exportFile(outputFile); 
      } 
     } 
    } 

    private boolean outputFileIsValid(File outputFile) { 
     boolean fileIsValid = false; 
     if (outputFile.exists()) { 
      int result = JOptionPane.showConfirmDialog(
        exportButton.getParent(), 
        "File exists, overwrite?", "File exists", 
        JOptionPane.YES_NO_CANCEL_OPTION); 
      switch (result) { 
      case JOptionPane.YES_OPTION: 
       fileIsValid = true; 
       break; 
      default: 
       fileIsValid = false; 
      } 
     } else { 
      fileIsValid = true; 
     } 
     return fileIsValid; 
    } 
}); 
4

Como dijo AvrDragon, cerrando con X no se maneja. Agregué un caso predeterminado para manejar todas las opciones irrelevantes:

final JFileChooser fc = new JFileChooser() { 

     private static final long serialVersionUID = 7919427933588163126L; 

     public void approveSelection() { 
      File f = getSelectedFile(); 
      if (f.exists() && getDialogType() == SAVE_DIALOG) { 
       int result = JOptionPane.showConfirmDialog(this, 
         "The file exists, overwrite?", "Existing file", 
         JOptionPane.YES_NO_CANCEL_OPTION); 
       switch (result) { 
       case JOptionPane.YES_OPTION: 
        super.approveSelection(); 
        return; 
       case JOptionPane.CANCEL_OPTION: 
        cancelSelection(); 
        return; 
       default: 
        return; 
       } 
      } 
      super.approveSelection(); 
     } 
    }; 
Cuestiones relacionadas