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

    [JAVA] jFileChooser customizzato selelzione diverse estensioni

    Ennesimo aiuto...

    Ho customizzato un jFileChooser per esportare un file derivante dal parsing di un database...Tutto bene fino a quando non devo esportarlo (o meglio semplicemente salvarlo)...
    Qua sorge il problema già molto discusso delle estensioni... per dare al file una determinata estensione, gliela devo scrivere direttamente oppure appendergliela alla fine attraverso un stringa cosa facile da fare...ma se invece volessi dare la possibilità all'utente di scegliere in che formato salvare???

    Insomma vorrei utilizzare il menu a tendina in basso al jFileChooser con l'append automatico dell'estensione a seconda della scelta utente.

    Per la funzione di import ho utilizzato un filtro ma solo per poter visualizzare solo determinati file...devo usare una cosa simile anche qua???

    Ho cercato in rete ma di preciso non ho trovato nulla...
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

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

    Re: [JAVA] jFileChooser customizzato selelzione diverse estensioni

    Originariamente inviato da vespaslight125
    Insomma vorrei utilizzare il menu a tendina in basso al jFileChooser con l'append automatico dell'estensione a seconda della scelta utente.
    A dire il vero puoi sapere quale filtro è selezionato tramite il metodo getFileFilter(). Questo però ti dà solo un oggetto di tipo FileFilter, il che non è molto "eloquente" poiché ha solo 2 metodi accept() (che non ci serve) e getDescription() (che direbbe molto poco perché è una descrizione).

    Però se hai tenuto da qualche parte i reference ai diversi filtri, puoi fare una catena di if e capire quale estensione è stata scelta.

    Se per i filtri hai usato la classe FileNameExtensionFilter (Java 6), fai un cast ed hai quindi a disposizione il metodo getExtensions(). Nulla comunque ti vieta di creare una "tua" classe che estende FileFilter (che è ciò che si deve fare in Java < 6) che ti fornisce le informazioni che vuoi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Per i filtri ho creato la una classe che estende FileFilter e ovviamente ho fatto l'override dei metodi accept() e getDescription()...ma questo l'ho fatto per importare i file...

    Io ora devo esportarli (salvarli)...forse mi sono spiegato male o non ho capito cosa intendi...

    Insomma la dinamica della mia applicazione è questa:

    1.clicco il JButton Export sul main JFrame
    2.viene visualizzato il jFileChooser dove devo inserire il nome del mio file
    3.devo scegliere l'estensione da dargli che nel mio caso sarà xml o xsd utilizzando il menu a tendina: "Tipo file" in basso
    4.clicco sul jbutton del jfilechooser per dare l'accept selection
    5.viene salvato il file nella directory selezionata con nome ed estensione scelti...

    P.s. non so nemmeno come far visualizzare più estensioni nel menù...con l'import mi bastava sovrascrivere il metodo getDescription però ritorna solo una stringa non più di una...
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    P.s. non so nemmeno come far visualizzare più estensioni nel menù...con l'import mi bastava sovrascrivere il metodo getDescription però ritorna solo una stringa non più di una...
    Di "user choosable file filters" ne puoi aggiungere quanti ne vuoi tramite il metodo addChoosableFileFilter() (scusa .. come hai fatto finora?).

    Quando ritorni dalla selezione, con getFileFilter() sai quale filtro è selezionato. A quel punto hai 2 strade: o testi i reference, se hai tenuto i singoli reference dei tuoi filtri oppure aggiungi qualcosa alla tua classe in modo che ti dica la estensione.

    Se hai fatto una tua classe ovviamente non posso sapere come l'hai implementata. Perché si potrebbe farla specifica, cioè con le estensioni "cablate" nel sorgente oppure generica e riutilizzabile come FileNameExtensionFilter.

    Non so se mi sono spiegato, le due soluzioni potrebbero essere (io faccio l'esempio con FileNameExtensionFilter):

    [parte comune]
    codice:
    FileFilter gifFilter = new FileNameExtensionFilter (.....);
    FileFilter jpgFilter = new FileNameExtensionFilter (.....);
    
    chooser.addChoosableFileFilter (gifFilter);
    chooser.addChoosableFileFilter (jpgFilter);
    poi quando è approvata la selezione:

    A)
    codice:
    FileFilter selectedFilter = chooser.getFileFilter ();
    
    if (selectedFilter == gifFilter) {
        // hai selezionato gif
    } else if (selectedFilter == jpgFilter) {
        // hai selezionato jpg
    }
    B)
    codice:
    FileFilter selectedFilter = chooser.getFileFilter ();
    
    if (selectedFilter instanceof FileNameExtensionFilter)
    {
        FileNameExtensionFilter filt = (FileNameExtensionFilter) selectedFilter;
    
        String ext = filt.getExtensions()[0];  // scelgo la prima estensione
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok...do un'occhiata intanto dti posto il codice...magari trovi qualche caxxata che ho combinato...perchè ho fatto in maniera un po' diversa...

    codice:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.filechooser.*;
    import java.awt.BorderLayout;
    import javax.swing.border.TitledBorder;
    import javax.swing.border.EtchedBorder;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileOutputStream;
    
    /**
     * 
    
    Title: </p>
     *
     * 
    
    Description: </p>
     *
     * 
    
    Copyright: Copyright (c) 2007</p>
     *
     * 
    
    Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class ExpFrame
        extends JDialog {
    
      //Flag for the Pack Frame
      boolean packFrame = false;
    
      //JavaGIS
      JavaGIS gisdatabase = new JavaGIS();
    
      //Parser
      Parser parser = new Parser();
    
      //ContentPane
      JPanel contentPane;
    
      //Layouts
      BorderLayout borderLayout1 = new BorderLayout();
      BorderLayout borderLayout2 = new BorderLayout();
    
      //Panels
      JPanel center = new JPanel();
      JPanel west = new JPanel();
      JPanel south = new JPanel();
      JPanel east = new JPanel();
      JPanel north = new JPanel();
    
      //Title
      TitledBorder titledBorder1 = new TitledBorder("Select the Location to Export");
    
      //FileChooser
      JFileChooser fileChooser = new JFileChooser();
    
      public ExpFrame(JFrame owner) {
        super(owner, true);
    
        //Call to the jbInit
        try {
          jbInit();
        }
        catch (Exception exception) {
          exception.printStackTrace();
        }
      }
    
      /**
       * Component initialization.
       *
       * @throws java.lang.Exception
       */
    
      private void jbInit() throws Exception {
    
        // Validate frames that have preset sizes
        // Pack frames that have useful preferred size info, e.g. from their layout
        if (packFrame) {
          this.pack();
        }
        else {
          this.validate();
        }
    
        //Frame Initialization
        setSize(new Dimension(600, 450));
        setResizable(false);
        setTitle("Export File...");
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(borderLayout1);
    
        //Position on the Screen
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();
        if (frameSize.height > screenSize.height) {
          frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
          frameSize.width = screenSize.width;
        }
        this.setLocation( (screenSize.width - frameSize.width) / 2,
                         (screenSize.height - frameSize.height) / 2);
    
        //Set Title to the center Panel
        titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(
            EtchedBorder.RAISED, Color.white, new Color(134, 134, 134)),
                                         "Select the Location to Export");
    
        //Set Properties to the Center Panel
        center.setLayout(borderLayout2);
        center.setBorder(titledBorder1);
    
        //Set Properties to the other Auxiliaries Panels
        west.setBackground(Color.gray);
        north.setBackground(Color.gray);
        east.setBackground(Color.gray);
        south.setBackground(Color.gray);
    
        //Set Properties to the FileChooser
        fileChooser.setMultiSelectionEnabled(true);
        fileChooser.addActionListener(new ExpFrame_fileChooser_actionAdapter(this));
        fileChooser.setApproveButtonText("Export");
        fileChooser.setAcceptAllFileFilterUsed(false);
        ExpFrame.JavaFilter filter = new JavaFilter();    
        fileChooser.setFileFilter(filter);  
    
        //Add all the Panel to the ContentPane
        contentPane.add(center, java.awt.BorderLayout.CENTER);
        contentPane.add(south, java.awt.BorderLayout.SOUTH);
        contentPane.add(north, java.awt.BorderLayout.NORTH);
        contentPane.add(west, java.awt.BorderLayout.WEST);
        contentPane.add(east, java.awt.BorderLayout.EAST);
    
        //Add FileChooser to the Center Panel
        center.add(fileChooser, java.awt.BorderLayout.CENTER);
    
        //Set Visible True
        this.setVisible(true);
    
      }
    
      //Inner Class to Implement Files Filter
      public class JavaFilter
          extends FileFilter {
        //Methods Overriding
        //Description of the Files needed
        public String getDescription() {
          return "xml";
        } 
        //Description of the Extension Accepted
        public boolean accept(java.io.File file) {
          return file.isDirectory() || file.getName().endsWith(".xml") ||
              file.getName().endsWith(".xsd");
        }
    
      }
    
      /**
       * Events Management on the two Buttons: Import and Cancel
       * @param e ActionEvent
       */
    
      public void fileChooser_actionPerformed(ActionEvent e) {
    
        //Event on the Button that Approve the Selection
        if (e.getActionCommand().toString() == "ApproveSelection") {
    
    
    
           try{
           FileOutputStream f=new FileOutputStream(fileChooser.getSelectedFile().getAbsolutePath()+".xml");
    
           }catch(Exception x){}
    
          setVisible(false);
        }
    
        //Event on the Button that Cancel the Selection
        if (e.getActionCommand().toString() == "CancelSelection") {
          this.dispose();
        }
      }
    
    }
    
    //Class Adapter to Avoid the Overriding of all Methods
    class ExpFrame_fileChooser_actionAdapter
        implements ActionListener {
      private ExpFrame adaptee;
      ExpFrame_fileChooser_actionAdapter(ExpFrame adaptee) {
        this.adaptee = adaptee;
      }
    
      //Function to Perform the Event
      public void actionPerformed(ActionEvent e) {
        adaptee.fileChooser_actionPerformed(e);
      }
    }
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  6. #6
    Ok...si giusto non avevo chiaro come funzionavano i filtri si vede...stupidata!!! Ora provo a fare gli if per l'append dell'estensione...grazie...
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    intanto dti posto il codice...magari trovi qualche caxxata che ho combinato...perchè ho fatto in maniera un po' diversa...
    Sì, vedo .... oddio non mi sembra la cosa più bella di questo mondo aggiungere un JFileChooser dentro un layout ma tecnicamente è fattibilissimo.

    Comunque, a parte questioni di design, vedo che hai fatto una classe apposita "cablata" per una estensione specifica. Adesso usi setFileFilter e va bene perché hai solo 1 filtro. Se ne avessi di più devi usare addChoosableFileFilter().

    A questo punto dovresti: a) creare altre classi per ogni estensione oppure b) realizzare una classe generica per il filtro.

    Resta il fatto che le due principali soluzioni sono quelle che ho indicato sopra: o determini l'estensione testando i reference dei filtri o trovi il modo di "chiedere" al filtro che estensione gestisce.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Perfetto!!! FUNZIONA TUTTO!!!
    Però pensavo che mi lanciasse in automatico un'eccezione quando si tenta di salvare due file con lo stesso nome...invece me li sovrascrive...qualche idea su come fare???

    codice:
    if(e.getActionCommand().toString=="ApproveSelection"){
    
    selectedfilter=fc.getFileFilter();
    
    if(selectedfilter==xmlfilter){
    
    try{
    
    out=new FileOutputStream(fc.getSelectedFile().getAbsolutePath()+".xml");
    
    }
    catch (Exception e){}
    
    else...
    
    }
    }
    
    }
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    Però pensavo che mi lanciasse in automatico un'eccezione quando si tenta di salvare due file con lo stesso nome...invece me li sovrascrive...qualche idea su come fare???
    Di norma le classi per la scrittura sovrascrivono il file. Ma c'è anche la possibilità di fare l'append, FileOutputStream ha un costruttore apposito che ha un parametro 'boolean append'.

    Ti interessa scoprire se il file esiste già? Con l'oggetto File basta che usi il metodo exists().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Si vorrei che se inserisco come nome pippo e nella directory esiste già un pippo.xml me lo impedisse di creare...

    codice:
    if(e.getActionCommand().toString=="ApproveSelection"){
    
    selectedfilter=fc.getFileFilter();
    
    if(selectedfilter==xmlfilter){
    
    try{
    
    out=new FileOutputStream(fc.getSelectedFile().getAbsolutePath()+".xml");
    
    }
    catch (Exception e){}
    
    else...
    
    }
    }
    
    }
    Se io inserisco

    codice:
     fc.getSelectedFile().exists();
    in un if dovrebbe andare giusto??? ma ho notato che se mi faccio stampare il valore boolean di ritorno mi restituisce sempre false...dovunque io lo metta (pensavo fosse un problema di visibilità)
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

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.