FileChooser per salvare file

di il
8 risposte

FileChooser per salvare file

Salve,
vorrei creare un jfilechooser per salvare un riferimento di tipo BufferedImage e vorrei anche poter scegliere l'estensione del file.
Come posso fare?
Grazie

8 Risposte

  • Re: FileChooser per salvare file

    Per prima cosa direi di fare una ricerca su Google... link. Qui trovi come utilizzare un JFileChooser.
  • Re: FileChooser per salvare file

    Grazie per il link
    Ho fatto questa classe per gestire i diversi tipi di estensioni
    
    public class FileAllFilter extends FileFilter {
    
        private String extension;
        private String description;
    
        public FileAllFilter(String extension, String description) {
            this.extension = extension;
            this.description = description;
        }
    
        @Override
        public boolean accept(File f) {
            return f.isDirectory() || f.getName().endsWith(extension);
        }
    
        @Override
        public String getDescription() {
            return this.description;
        }
    
        public String getExtension() {
            return this.extension;
        }
    
    e nell'azione salva ho fatto questo:
    FileAllFilter filterJpg = new FileAllFilter("jpg", "File jpg");
                FileAllFilter filterPng = new FileAllFilter("png", "File png");
                fileChooser.addChoosableFileFilter(filterJpg);
                fileChooser.addChoosableFileFilter(filterPng);
                
                
                
                int result = fileChooser.showSaveDialog(vista);
    
                if (result == JFileChooser.APPROVE_OPTION) {
                    file = fileChooser.getSelectedFile();
                    javax.swing.filechooser.FileFilter currentFilter = fileChooser.getFileFilter();
    
                    if (currentFilter instanceof FileAllFilter) {
                        estensione = ((FileAllFilter) currentFilter).getExtension();
               
               if (!file.getName().endsWith(estensione)) {
                            String nme = file.getPath();
                            nome = nome + estensione;
                            file = new File(nome);
                        }
                    }
                     if (file.exists()) {
                        int scelta = JOptionPane.showConfirmDialog(vista, "File già esistente, sostituirlo?", "Conferma", JOptionPane.YES_OPTION);
                        
                        try {
                            if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getBufferedImage(), estensione, file);
    
                            } else {
                               ImageIO.write(immagine.getBufferedImage(), estensione, file);
                            }
                        } catch (IOException ex) {
                        }
                    }
                }
    Quindi vedo le possibili opzioni per il salvataggio ma non viene salvato niente.
    Grazie
  • Re: FileChooser per salvare file

    MariaMaria ha scritto:


    return f.isDirectory() || f.getName().endsWith(extension);
    Innanzitutto una nota su questo test. Per evitare di avere problemi con il case maiuscolo/minuscolo, sarebbe bene rendere il nome in lowercase (con toLowerCase() ) e poi dovresti testare se finisce per ".xyz" .... non solo "xyz". Nota il punto.

    (idem quando poi testi l'estensione dopo)

    MariaMaria ha scritto:


                     if (file.exists()) {
                        int scelta = JOptionPane.showConfirmDialog(vista, "File già esistente, sostituirlo?", "Conferma", JOptionPane.YES_OPTION);
                        
                        try {
                            if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getBufferedImage(), estensione, file);
    
                            } else {
                               ImageIO.write(immagine.getBufferedImage(), estensione, file);
                            }
                        } catch (IOException ex) {
                        }
                    }
    Beh, qui la logica fa un po' "acqua". Nel senso che se il file esiste già lo sovrascrivi. Ma se non esiste .... non lo scrivi proprio!
    Il 'else' va fatto quando il file non esiste .... non quando l'utente dice "no".
  • Re: FileChooser per salvare file

    Grazie per la risposta.
    Ho modificato il metodo accept in questo modo
     public boolean accept(File f) {
            return f.isDirectory() || f.getName().toLowerCase().endsWith(extension);
        }
    e quando richiamo la classe
    FileAllFilter filterJpg = new FileAllFilter(".jpg", "File jpg");
    passo all'estensione direttamente il .
    Questo basta oppure devo inserire il punto in qualche altro controllo?

    Per quanto riguarda la seconda parte
    if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getBufferedImage(), estensione, file);
    
                            } else {
                               ImageIO.write(immagine.getBufferedImage(), estensione, file);
                            }
    quest'else non ha senso di esistere?

    Devo modificare il tutto in questo modo?
    try {
                        if (file.exists()) {
                            int scelta = JOptionPane.showConfirmDialog(vista, "File già esistente, sostituirlo?", "Conferma", JOptionPane.YES_OPTION);
                      
                            if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getOriginalImage(), estensione, file);
                            }
                        } else {
                            ImageIO.write(immagine.getOriginalImage(), estensione, file);
                        }
                    } catch (IOException ex) {
                        
                    }
    Grazie ancora
  • Re: FileChooser per salvare file

    MariaMaria ha scritto:


    e quando richiamo la classe
    FileAllFilter filterJpg = new FileAllFilter(".jpg", "File jpg");
    passo all'estensione direttamente il .
    Se vuoi passarlo qui, beh, non te lo vieto certo io.
    Personalmente io non lo farei (e nemmeno la classe javax.swing.filechooser.FileNameExtensionFilter da Java 6 lo fa, cioè non vuole il "." iniziale per la/e estensione/i passate al costruttore).
    Per un motivo più che altro concettuale: la correttezza del concetto (e poi del controllo) della estensione dipenderebbe da cosa viene passato, insomma, sarebbe error prone. Se per sbaglio viene passato ",jpg", questa non è una estensione.

    MariaMaria ha scritto:


    Per quanto riguarda la seconda parte
    if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getBufferedImage(), estensione, file);
    
                            } else {
                               ImageIO.write(immagine.getBufferedImage(), estensione, file);
                            }
    quest'else non ha senso di esistere?
    Non lì nel if della scelta!
    Il file lo devi scrivere solo se:
    a) Il file non esiste.
    oppure
    b) Il file esiste E l'utente ha confermato la sovrascrittura.

    Tradotto in pseudo codice:
    IF file_esiste THEN
        chiedi_conferma_sovrascrittura
        IF sovrascrittura_confermata THEN
            scrivi_file
        END IF
    ELSE
        scrivi_file
    END IF
    E invece di ripetere 2 volte "scrivi_file" puoi anche assegnare ad un boolean "scrivi" e poi lo usi, se true, allora scrivi.

    P.S. ricorda anche che il 2° parametro di write di ImageIO è il formatName (quindi es. "png") .... non la estensione (".png").
  • Re: FileChooser per salvare file

    In definitiva dovrei fare qualcosa del genere per la questione del .
    f.isDirectory() || f.getName().toLowerCase().endsWith("."+extension);
    e quindi di conseguenza ripristinare
    FileAllFilter filterJpg = new FileAllFilter("jpg", "File jpg");
    FileAllFilter filterPng = new FileAllFilter("png", "File png");
    Modificare anche
     if (!file.getName().endsWith(estensione)) {
                            String nome = file.getPath();
                            nome = nome + "."+estensione;
                            file = new File(nome);
                        }
    Il pezzo di codice con problemi di logica dovrebbe essere così?
    try {
                        if (file.exists()) {
                            int scelta = JOptionPane.showConfirmDialog(vista, "File già esistente, sostituirlo?", "Conferma", JOptionPane.YES_OPTION);
                            if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getOriginalImage(), estensione, file);
                            }
                        } else {
                            ImageIO.write(immagine.getOriginalImage(), estensione, file);
                        }
                    } catch (IOException ex) {
                        
                    }
    Inoltre se il tutto dovesse funzionare il file verrebbe salvato nella cartella che contiene anche il file originale, mentre se si volesse impostare come cartella di destinazione una nuova cartella, oltre che modificare il nome della cartella devo modificare altro al mio codice?
    Grazie
  • Re: FileChooser per salvare file

    MariaMaria ha scritto:


    In definitiva dovrei fare qualcosa del genere per la questione del .
    f.isDirectory() || f.getName().toLowerCase().endsWith("."+extension);
    Tecnicamente sì. Visto però che questa riga viene eseguita per ogni file che JFileChooser deve elencare, ti suggerirei di fare la unione del punto una volta sola. Tieni un campo es. "suffix" ("suffisso" ... come vuoi) che imposti al costruttore. Poi usa quello nel endsWith.

    MariaMaria ha scritto:


    e quindi di conseguenza ripristinare
    FileAllFilter filterJpg = new FileAllFilter("jpg", "File jpg");
    FileAllFilter filterPng = new FileAllFilter("png", "File png");
    Sì, ok.

    MariaMaria ha scritto:


    Modificare anche
     if (!file.getName().endsWith(estensione)) {
                            String nome = file.getPath();
                            nome = nome + "."+estensione;
                            file = new File(nome);
                        }
    Il test con endsWith pure qui va col ".".
    La composizione del nome anche, l'avevo notata prima ma mi sono scordato di segnalartelo subito.

    MariaMaria ha scritto:


    Il pezzo di codice con problemi di logica dovrebbe essere così?
    try {
                        if (file.exists()) {
                            int scelta = JOptionPane.showConfirmDialog(vista, "File già esistente, sostituirlo?", "Conferma", JOptionPane.YES_OPTION);
                            if (scelta == JOptionPane.YES_OPTION) {
                                ImageIO.write(immagine.getOriginalImage(), estensione, file);
                            }
                        } else {
                            ImageIO.write(immagine.getOriginalImage(), estensione, file);
                        }
                    } catch (IOException ex) {
                        
                    }
    Sì, ora la logica è corretta.

    MariaMaria ha scritto:


    Inoltre se il tutto dovesse funzionare il file verrebbe salvato nella cartella che contiene anche il file originale
    No, dove lo sceglie l'utente col file chooser ..... è quello che stai gestendo qui, no?
  • Re: FileChooser per salvare file

    Perfetto!
    Grazie infinite per la disponibilità, funziona tutto correttamente
Devi accedere o registrarti per scrivere nel forum
8 risposte