Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    JFileChooser e exists()

    sto cercando di migliorare il file chooser per controllare se il file già esiste.
    ho già usato il metodo exists() da altre parti, ma nn riesco a integrarlo qua:
    codice:
    import javax.swing.*;
    import java.io.*;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    public class AreaFileChooser extends JFrame {
    
        public static void salva() {
            JFileChooser fc = new JFileChooser();
            FileFilter csvFilter = new FileNameExtensionFilter("File CSV", "csv");
            FileFilter txtFilter = new FileNameExtensionFilter("File TXT", "txt");
            fc.addChoosableFileFilter(csvFilter);
            fc.addChoosableFileFilter(txtFilter);
            int returnVal = fc.showSaveDialog(fc);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                FileFilter selectedFilter = fc.getFileFilter();
                if (f.getName().indexOf('.') == -1) {
                    if (selectedFilter == csvFilter) {
                        f = new File(f.getPath() + ".csv");
                    } else if (selectedFilter == txtFilter) {
                        f = new File(f.getPath() + ".txt");
                    }
                }
                try {
                    FileWriter file = new FileWriter(f, true);
                    PrintWriter out = new PrintWriter(file);
                    if(f.exists()){
                        // mostra una finestra di scelta
                          if (ho cliccato sul taso yes){
                              sovrascrivi file
                                 } else {
                                     chiudi la finestra e nn fare nulla
                    }
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }
    ho fatto delle prove con un semplice joptionpane che doveva teoricamente comparire se il file c'era: il quel caso compariva la finestrella, sennò scriveva il file.
    invece compariva sempre la finestra.
    inoltre:
    -penso di nn dover usare un joption pane per una cosa del genere.
    cosa mi consigliate?
    un jdialog?
    -in caso lo implemento in un altro file e poi lo richiamo qui, giusto?
    -la teoria è giusta o sbaglio nell'utilizzo di exists()??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Tra i miei Java Examples, sezione File choosers, c'è proprio un esempio di estensione di JFileChooser per gestire l'avvertimento di sovrascrittura. E per come è implementato il file chooser resta aperto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    eccomi qua.
    ho preso il tuo esempio come riferimento e sto cercando di integrare il mio.
    ho aggiunto i vari filtri.
    però ho un errore:
    codice:
    import java.io.*;
    import java.text.*;
    import javax.swing.*;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    public class FileChooserArea {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                public void run() {
                    JFileChooser fc = new SafeOverwriteFileChooser();
    //                fc.showSaveDialog(null);
                    FileFilter csvFilter = new FileNameExtensionFilter("File CSV", "csv");
                    FileFilter txtFilter = new FileNameExtensionFilter("File TXT", "txt");
                    fc.addChoosableFileFilter(csvFilter);
                    fc.addChoosableFileFilter(txtFilter);
                    fc.addChoosableFileFilter(csvFilter);
                    fc.addChoosableFileFilter(txtFilter);
                    int returnVal = fc.showSaveDialog(fc);
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
                        File f = fc.getSelectedFile();
                        FileFilter selectedFilter = fc.getFileFilter();
                        if (f.getName().indexOf('.') == -1) {
                            if (selectedFilter == csvFilter) {
                                f = new File(f.getPath() + ".csv");
                            } else if (selectedFilter == txtFilter) {
                                f = new File(f.getPath() + ".txt");
                            }
                        }
                    }
                }
            });
        }
    }
    
    class SafeOverwriteFileChooser extends JFileChooser {
    
        private static final String DEFAULT_CONFIRM_TITLE = "Confirm";
        private static final String DEFAULT_CONFIRM_MESSAGE = "The entry ''{0}'' already exists.\nDo you want to replace it?";
        private String confirmTitle;
        private String confirmMessage;
    
        public SafeOverwriteFileChooser() {
            this(DEFAULT_CONFIRM_TITLE, DEFAULT_CONFIRM_MESSAGE);
        }
    
        public SafeOverwriteFileChooser(String confirmTitle, String confirmMessage) {
            this.confirmTitle = confirmTitle;
            this.confirmMessage = confirmMessage;
        }
    
        public void approveSelection() {
            if (getDialogType() == SAVE_DIALOG) {
                File f = getSelectedFile();
    
                if (f.exists()) {
                    String msg = MessageFormat.format(confirmMessage, new Object[]{f});
                    int r = JOptionPane.showConfirmDialog(this, msg, confirmTitle, JOptionPane.YES_NO_OPTION);
                    if (r == JOptionPane.NO_OPTION) {
                        // Returns without approve the selection.
                        return;
                    }
                }
            } else {
                try {
                    FileWriter file = new FileWriter(f, true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(TArea.getJarea().getText() + "\n" + "Tot entrate: " + TArea.getfield9().getText() + "\nTot uscite: " + TArea.getfield10().getText() + "\nTOT: " + TArea.getfield15().getText() + "\nTot operazioni: " + TArea.getfield16().getText());
                    out.close();
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
                }
            }
            // Approves the selection normally.
            super.approveSelection();
        }
    }
    codice:
    /media/MATTE/Banca/src/banca/FileChooserArea.java:70: cannot find symbol
    symbol  : variable f
    location: class banca.SafeOverwriteFileChooser
                    FileWriter file = new FileWriter(f, true);
    /media/MATTE/Banca/src/banca/FileChooserArea.java:75: cannot find symbol
    symbol  : variable fc
    location: class banca.SafeOverwriteFileChooser
                    JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
    2 errors
    /media/MATTE/Banca/nbproject/build-impl.xml:528: The following error occurred while executing this line:
    /media/MATTE/Banca/nbproject/build-impl.xml:261: Compile failed; see the compiler error output for details.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    codice:
      JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
    dovresti leggere quello che ti dice il compilatore, fc è un simbolo sconosciuto alla riga in esame, significa che è una variabile che non esiste (in quel punto).
    Lo definisci sopra, ma come variabile locale e giustamente non è vista sotto quando vuoi visualizzare l'errore
    Correggi e ricompila

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    eccomi qua.
    ho preso il tuo esempio come riferimento e sto cercando di integrare il mio.
    Peccato che è "integrato" concettualmente male.

    Non devi mettere la logica della tua scrittura su file dentro SafeOverwriteFileChooser!!!

    Insomma dentro SafeOverwriteFileChooser è incapsulata solo la logica di avvertimento e conferma di sovrascrittura del file già esistente e non c'è bisogno di altro.

    La fase di scrittura la devi fare nell'altro tuo codice quando l'utente ha approvato (APPROVE_OPTION) la selezione, perché usando il SafeOverwriteFileChooser sei già "sicuro" che l'utente ha davvero approvato la selezione e confermato di voler sovrascrivere.
    Se nessuna di queste due condizioni è vera, non si arriva proprio ad avere il APPROVE_OPTION.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    cioè: quando decido di salvare il contenuto della textarea richiamo:
    codice:
    package banca;
    
    import java.io.*;
    import java.text.*;
    import javax.swing.*;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    public class FileChooserArea {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                public void run() {
                    JFileChooser fc = new SafeOverwriteFileChooser();
    //                fc.showSaveDialog(null);
                    FileFilter csvFilter = new FileNameExtensionFilter("File CSV", "csv");
                    FileFilter txtFilter = new FileNameExtensionFilter("File TXT", "txt");
                    fc.addChoosableFileFilter(csvFilter);
                    fc.addChoosableFileFilter(txtFilter);
                    fc.addChoosableFileFilter(csvFilter);
                    fc.addChoosableFileFilter(txtFilter);
                    int returnVal = fc.showSaveDialog(fc);
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
                        File f = fc.getSelectedFile();
                        FileFilter selectedFilter = fc.getFileFilter();
                        if (f.getName().indexOf('.') == -1) {
                            if (selectedFilter == csvFilter) {
                                f = new File(f.getPath() + ".csv");
                            } else if (selectedFilter == txtFilter) {
                                f = new File(f.getPath() + ".txt");
                            }
                        }
                    }
                }
            });
        }
    }
    
    class SafeOverwriteFileChooser extends JFileChooser {
    
        private static final String DEFAULT_CONFIRM_TITLE = "Confirm";
        private static final String DEFAULT_CONFIRM_MESSAGE = "The entry ''{0}'' already exists.\nDo you want to replace it?";
        private String confirmTitle;
        private String confirmMessage;
    
        public SafeOverwriteFileChooser() {
            this(DEFAULT_CONFIRM_TITLE, DEFAULT_CONFIRM_MESSAGE);
        }
    
        public SafeOverwriteFileChooser(String confirmTitle, String confirmMessage) {
            this.confirmTitle = confirmTitle;
            this.confirmMessage = confirmMessage;
        }
    
        public void approveSelection() {
            if (getDialogType() == SAVE_DIALOG) {
                File f = getSelectedFile();
                if (f.exists()) {
                    String msg = MessageFormat.format(confirmMessage, new Object[]{f});
                    int r = JOptionPane.showConfirmDialog(this, msg, confirmTitle, JOptionPane.YES_NO_OPTION);
                    if (r == JOptionPane.NO_OPTION) {
                        // Returns without approve the selection.
                        return;
                    }
                }
            }
            // Approves the selection normally.
            super.approveSelection();
            SalvaDati.salva(); // richiamo il file per salvare
        }
    }
    che è il tuo esempio più i filtri.
    se approvo la sovrascrittura (o se il file nn esiste già) richiamo il file per salvare:
    codice:
    package banca;
    
    import java.io.*;
    import javax.swing.*;
    
    public class SalvaDati {
    
        public static void salva() {
            try {
                FileWriter file = new FileWriter(f, true);
                PrintWriter out = new PrintWriter(file);
                out.println(TArea.getJarea().getText() + "\n" + "Tot entrate: " + TArea.getfield9().getText() + "\nTot uscite: " + TArea.getfield10().getText() + "\nTOT: " + TArea.getfield15().getText() + "\nTot operazioni: " + TArea.getfield16().getText());
                out.close();
            } catch (IOException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
        }
    }

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    cioè: quando decido di salvare il contenuto della textarea richiamo:
    codice:
    class SafeOverwriteFileChooser extends JFileChooser {
    
        public void approveSelection() {
            .....
    
            // Approves the selection normally.
            super.approveSelection();
            SalvaDati.salva(); // richiamo il file per salvare
        }
    }
    NOO. Ripeto: in SafeOverwriteFileChooser NON devi invocare né direttamente né indirettamente la tua "logica" di scrittura su file.

    codice:
    JFileChooser fc = new SafeOverwriteFileChooser();
    ....
    int returnVal = fc.showSaveDialog(fc);
    
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        // Qui sei SICURO che l'utente ha approvato (cliccato su "Apri" o equivalente nel chooser)
        // **E**
        // se il file esiste già ha CONFERMATO sulla box di avvertimento/conferma ("SI, voglio sovrascrivere!")
    
        // Quindi SCRIVI su file
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ho fatto così:
    codice:
    import javax.swing.*;
    import java.io.*;
    import java.text.MessageFormat;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    public class SalvaArea extends JFrame {
    
        public static void salva() {
            JFileChooser fc = new JFileChooser();
            FileFilter csvFilter = new FileNameExtensionFilter("File CSV", "csv");
            FileFilter txtFilter = new FileNameExtensionFilter("File TXT", "txt");
            fc.addChoosableFileFilter(csvFilter);
            fc.addChoosableFileFilter(txtFilter);
            int returnVal = fc.showSaveDialog(fc);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                FileFilter selectedFilter = fc.getFileFilter();
                if (f.getName().indexOf('.') == -1) {
                    if (selectedFilter == csvFilter) {
                        f = new File(f.getPath() + ".csv");
                    } else if (selectedFilter == txtFilter) {
                        f = new File(f.getPath() + ".txt");
                    }
                }
                if (f.exists()) {
                    String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                    int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                    if (r == JOptionPane.NO_OPTION) {
                        // Returns without approve the selection.
                        return;
                    }
                }
                try {
                    FileWriter file = new FileWriter(f, true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(TArea.getJarea().getText() + "\n" + "Tot entrate: " + TArea.getfield9().getText() + "\nTot uscite: " + TArea.getfield10().getText() + "\nTOT: " + TArea.getfield15().getText() + "\nTot operazioni: " + TArea.getfield16().getText());
                    out.close();
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }
    però nn funziona del tutto.
    cioè, riconosce se esiste già un file con quel nome e quell'estensione.
    ma se gli dico di sostituirlo nn lo fa senza darmi errori.

  9. #9
    fatto altre prove.
    -mi crea tranquillamente file da zero
    -se c'è già un file vuoto e clicco su si me lo riempie
    -se c'è già un file con qualcosa scritto , il contenuto nn lo sostituisce ma lo aggiunge.

    questo comportamento nn mi piace molto.
    nn è possibile dirgli di cancellare tutto e riscrivere il file da zero??
    codice:
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                FileFilter selectedFilter = fc.getFileFilter();
                if (f.getName().indexOf('.') == -1) {
                    if (selectedFilter == csvFilter) {
                        f = new File(f.getPath() + ".csv");
                    } else if (selectedFilter == txtFilter) {
                        f = new File(f.getPath() + ".txt");
                    }
                }
                if (f.exists()) {
                    String msg = MessageFormat.format("The entry ''{0}'' already exists.\nDo you want to replace it?", new Object[]{f});
                    int r = JOptionPane.showConfirmDialog(null, msg, "Confirm", JOptionPane.YES_NO_OPTION);
                    if (r == JOptionPane.NO_OPTION) {
                        // Returns without approve the selection.
                        return;
                    }
                }
                try {
                    FileWriter file = new FileWriter(f, true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(TArea.getJarea().getText() + "\n" + "Tot entrate: " + TArea.getfield9().getText() + "\nTot uscite: " + TArea.getfield10().getText() + "\nTOT: " + TArea.getfield15().getText() + "\nTot operazioni: " + TArea.getfield16().getText());
                    out.close();
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(fc, e, "ERRORE", JOptionPane.ERROR_MESSAGE);
                }
            }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    nn è possibile dirgli di cancellare tutto e riscrivere il file da zero??
    codice:
    FileWriter file = new FileWriter(f, true);
    Hai usato il flag di "append" a true. Se non volevi l'append .... toglilo, no?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.