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

    Help si filtri JFileChooser

    sto cercando di mettere dei filtri in modo che l'utente possa scegliere in che formato salvare.
    per ora sono riuscito o a impostare il salvataggio sempre in .txt (che però nn mi piace molto), o di fare decidere all'utente se salvare in .txt (nel menu a tendina delle estensioni mi compare la scelta txt).
    però anche se scelgo File TXT nn mi aggiunge l'estensione.
    codice:
    JFileChooser fc = new JFileChooser();
            fc.addChoosableFileFilter (new FileNameExtensionFilter ("File TXT", "txt"));
            int returnVal = fc.showSaveDialog(this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                try {
                    FileWriter file = new FileWriter(f, true);
    //                FileWriter file = new FileWriter(f.getAbsolutePath() + ".txt", true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(jTextArea1.getText());
                    out.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
    nn riesco a capire che mi manca.
    ho provate vari metodi sia alla riga File f...., che in quella FileWriter....

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Help si filtri JFileChooser

    Originariamente inviato da fermat
    sto cercando di mettere dei filtri in modo che l'utente possa scegliere in che formato salvare.
    per ora sono riuscito o a impostare il salvataggio sempre in .txt (che però nn mi piace molto), o di fare decidere all'utente se salvare in .txt (nel menu a tendina delle estensioni mi compare la scelta txt).
    però anche se scelgo File TXT nn mi aggiunge l'estensione.
    Chiariamo subito una cosa: i "choosable file filter" di JFileChooser cioè i filtri selezionabili dall'utente hanno uno scopo puramente "visuale", per filtrare solo ciò che si vede nell'elenco dei file.
    Non viene usato per altro (per default). Non impone nulla a livello di ciò che può o non può scegliere l'utente. Difatti l'utente può benissimo andare nel campo di testo "Nome file" e digitare pippo.xyz e viene perfettamente accettato (nel caso di Save dialog anche se non esistesse).

    Se vuoi che il JFileChooser si chiuda e accetti un file solo se è accettabile secondo il filtro selezionato, si può fare e trovi oltretutto un esempio tra i miei Java Examples.

    Se vuoi che l'utente possa indicare un nome di file senza estensione (es. "pippo") e venga poi completato in base al filtro selezionato (es. se filtra per i txt componga "pippo.txt"), si può anche fare ma a "valle" ovvero dopo che il chooser si è chiuso.
    Semplicemente se il file non ha estensione (si cerca un finale "punto qualcosa") lo si completa andando anche a vedere quale filtro è quello selezionato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    in sostanza quindi dovrei fare una cosa del genere:
    codice:
    JFileChooser fc = new JFileChooser();
            fc.addChoosableFileFilter(new FileNameExtensionFilter("File CSV", "csv"));
            fc.addChoosableFileFilter(new FileNameExtensionFilter("File TXT", "txt"));
            int returnVal = fc.showSaveDialog(this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                try {
    if (è stato selezionato txt){
    FileWriter file = new FileWriter(f.getAbsolutePath() + ".txt", true); // così mi aggiunge l'estensione txt
                    PrintWriter out = new PrintWriter(file);
                    out.println(jTextArea1.getText());
                    out.close();
    }
    if (è stato selezionato csv){
    FileWriter file = new FileWriter(f.getAbsolutePath() + ".csv", true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(jTextArea1.getText());
                    out.close();
    }
    } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    in sostanza quindi dovrei fare una cosa del genere:
    codice:
    if (è stato selezionato txt){
    FileWriter file = new FileWriter(f.getAbsolutePath() + ".txt", true); // così mi aggiunge l'estensione txt
    No, non proprio. Perché così aggiungi .txt sempre, anche nel caso che il nome avesse già una estensione (se l'utente sceglie pippo.txt, tu componi pippo.txt.txt ... poco sensato).

    "se è stato selezionato il filtro .txt E se il nome non ha estensione ALLORA aggiungi .txt"

    E comunque vedo che hai duplicato la parte di scrittura, che è uguale. Quindi cerca di separare le due cose cioè determinazione del file e scrittura.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    pensavo allora di mettere dentro alle istruzione if qualcosa come:
    if(selezionato txt){
    f.endsWith(".txt");
    }

    ho visto un pò in giro che si usa molto il metodo endsWith();
    il mio problema è che nn so cosa mettere nella condizione di if.
    come faccio a far capire il filechooser che è stata selezionato il File TXT??

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    pensavo allora di mettere dentro alle istruzione if qualcosa come:
    if(selezionato txt){
    f.endsWith(".txt");
    }

    ho visto un pò in giro che si usa molto il metodo endsWith();
    il mio problema è che nn so cosa mettere nella condizione di if.
    come faccio a far capire il filechooser che è stata selezionato il File TXT??
    1) Per la questione di riconoscere il filtro selezionato: tieni i riferimenti ai tuoi FileNameExtensionFilter in alcune tue variabili, alla fine con getFileFilter() ottieni il filtro attualmente selezionato e banalmente con == verifichi quale dei tuoi FileNameExtensionFilter è. Cioè ti basta verificare la "identità" dell'oggetto FileFilter.

    2) L'aggiunta della estensione potrebbe seguire uno dei 3 seguenti approcci, perlomeno sono quelli che mi paiono logici:

    a) Aggiungere la estensione solo se non c'è già. Se già ci fosse una estensione (anche non quella del filtro) lasci come è.
    pippo ---> pippo.txt
    pippo.txt OK
    pippo.xyz OK

    b) Aggiungere la estensione solo se non trovi proprio quella.
    pippo ---> pippo.txt
    pippo.txt OK
    pippo.xyz ---> pippo.xyz.txt

    c) Aggiungere o sostituire la estensione per assicurarsi che sia sempre quella del filtro.
    pippo ---> pippo.txt
    pippo.txt OK
    pippo.xyz ---> pippo.txt

    Nessuna delle tre è più giusta o sbagliata delle altre ... sono solo 3 concetti differenti che variano in cosa viene permesso all'utente o forzato automaticamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ho fatto una cosa del genere:
    codice:
    JFileChooser fc = new JFileChooser();
            FileFilter csv = new FileNameExtensionFilter("File CSV", "csv");
            FileFilter txt = new FileNameExtensionFilter("File TXT", "txt");
            fc.addChoosableFileFilter(csv);
            fc.addChoosableFileFilter(txt);
    ....
    solo che mi da il seguente errore:
    codice:
    reference to FileFilter is ambiguous, both class javax.swing.filechooser.FileFilter in javax.swing.filechooser and class java.io.FileFilter in java.io match
            FileFilter csv = new FileNameExtensionFilter("File CSV", "csv");
    reference to FileFilter is ambiguous, both class javax.swing.filechooser.FileFilter in javax.swing.filechooser and class java.io.FileFilter in java.io match
            FileFilter txt = new FileNameExtensionFilter("File TXT", "txt");
    nn ho capito se è un bug o un errore mio.
    cmq io ho importato questi package:
    import javax.swing.*;
    import java.io.*;
    import javax.swing.filechooser.*;

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    cmq io ho importato questi package:
    import java.io.*;
    import javax.swing.filechooser.*;
    La questione è che esiste un tipo che si chiama FileFilter sia in java.io che in javax.swing.filechooser. Entrambi hanno ovviamente come scopo concettuale quello di "accettare" o meno un File ma sono dedicati il primo all'uso con java.io.File e il secondo con javax.swing.JFileChooser.

    Avendo usato 2 import on-demand (quello che termina con .*), nominare solo FileFilter è ambiguo, perché potrebbe essere importato da entrambi i package.

    Lo risolvi aggiungendo un "single type import", che ha precedenza rispetto all'import on-demand

    import javax.swing.filechooser.FileFilter;
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    mi sono fermato qua:
    codice:
            JFileChooser fc = new JFileChooser();
            FileFilter csv = new FileNameExtensionFilter("File CSV", "csv");
            FileFilter txt = new FileNameExtensionFilter("File TXT", "txt");
            fc.addChoosableFileFilter(csv);
            fc.addChoosableFileFilter(txt);
            txt = fc.getFileFilter();
            csv = fc.getFileFilter();
            selectedfilter = fc.getFileFilter();
            int returnVal = fc.showSaveDialog(this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                try {
                    if (selectedfilter == txt) {
                    }
                    if (selectedfilter == csv) {
                    }
                    FileWriter file = new FileWriter(f, true);
                    PrintWriter out = new PrintWriter(file);
                    out.println(jTextArea1.getText());
                    out.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
    a parte che nn so se è giusto, ho provato varie cose negli if ma senza successo.
    il massimo che sono riuscito a ottenere è che mi ha slavato due volte con le due estensioni

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    codice:
            JFileChooser fc = new JFileChooser();
            FileFilter csv = new FileNameExtensionFilter("File CSV", "csv");
            FileFilter txt = new FileNameExtensionFilter("File TXT", "txt");
            fc.addChoosableFileFilter(csv);
            fc.addChoosableFileFilter(txt);
            txt = fc.getFileFilter();    // Inutile e senza senso!!!
            csv = fc.getFileFilter();    // Inutile e senza senso!!!
            selectedfilter = fc.getFileFilter();   // Questo serve dopo la approvazione della scelta per sapere appunto quale è il filtro attivo in quel momento!!
    Vedi commenti in rosso.

    P.S. Mi sembra quasi di essere un prof. che corregge con la biro rossa.
    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.