web-dev-qa-db-fra.com

Définir l'extension d'enregistrement par défaut avec JFileChooser

J'essaie de sauvegarder un fichier en utilisant JFileChooser. Cependant, il me semble avoir des problèmes avec cela. Voici mon code:

    if (e.getSource() == saveMenu) {

        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        FileNameExtensionFilter xmlFilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
        // add filters
        chooser.addChoosableFileFilter(xmlFilter);
        chooser.setFileFilter(xmlFilter);

        int result = chooser.showSaveDialog(Simulation.this);

        if (result == chooser.APPROVE_OPTION) {
            writeToXML(chooser.getSelectedFile());
        }

    }

Cela ne force pas le fichier à porter une extension .xml. J'ai donc essayé d'utiliser le code suivant pour forcer le fichier à être enregistré avec l'extension .xml

     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("UTF-8");
     XMLWriter xmlWriter = null;
     try {              
         xmlWriter = new XMLWriter(new OutputStreamWriter(
                 new FileOutputStream(f+".xml"), "UTF8"),
                 format);

Cependant, avec cela, je ne peux pas empêcher l’utilisateur d’écrire xpto.xml dans la JFileChooser et s’ils le font, le fichier aura "deux extensions": ce sera un fichier nommé xpto.xml.xml

Donc mes questions sont:

  • Comment puis-je faire en sorte que JFileChooser enregistre un fichier xml par défaut?
  • Si l'utilisateur insère un nom de fichier tel que xpto.xml, comment puis-je l'enregistrer sous xpto.xml et non xpto.xml.xml?
13
SaintLike

Comme vous l'avez remarqué, JFileChooser n'impose pas la FileFilter à une sauvegarde. Le fichier non-XML existant est grisé dans la boîte de dialogue qu'il affiche, mais c'est tout. Pour appliquer le nom de fichier, vous devez effectuer tout le travail. (Ce n’est pas seulement une question de succion de JFileChooser - c’est un problème complexe à traiter. Vous pourriez peut-être {vouloir} _ nommer leurs fichiers xml.xml.xml.xml.)

Dans votre cas, je vous recommande d'utiliser FilenameUtils from Commons IO:

File file = chooser.getSelectedFile();
if (FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("xml")) {
    // filename is OK as-is
} else {
    file = new File(file.toString() + ".xml");  // append .xml if "foo.jpg.xml" is OK
    file = new File(file.getParentFile(), FilenameUtils.getBaseName(file.getName())+".xml"); // ALTERNATIVELY: remove the extension (if any) and replace it with ".xml"
}

Il y a aussi quelques idées sur ce qu'il faut faire si vous voulez plusieurs types dans la boîte de dialogue de sauvegarde ici: Comment sauvegarder un fichier en utilisant JFileChooser?

19

Juste pour expliquer comment utiliser JFileChooser pour sauvegarder des fichiers.

//set it to be a save dialog
 chooser.setDialogType(JFileChooser.SAVE_DIALOG);
//set a default filename (this is where you default extension first comes in)
 chooser.setSelectedFile(new File("myfile.xml"));
//Set an extension filter, so the user sees other XML files
 chooser.setFileFilter(new FileNameExtensionFilter("xml file","xml"));

maintenant, l'utilisateur était invité à enregistrer l'élément en tant que fichier XML dans cet exemple, mais il se peut qu'il ne l'ait pas réellement défini.

if(chooser.showSaveDialog(this) == jFileChooser.APPROVE_OPTION)
{
   String filename = chooser.getSelectedFile().toString();
   if (!filename .endsWith(".xml"))
        filename += ".xml";

   //DO something with filename

 }

C'est le cas le plus simple. Si vous avez plusieurs formats de fichiers possibles, vous devez alors capturer le filtre sélectionné, vérifier cette extension et également enregistrer le fichier en fonction du format sélectionné. mais si vous faites cela, vous êtes probablement un programmeur Java expérimenté et n'utilisez pas ce post.

10
DiamondDrake

Que diriez-vous quelque chose comme ça:

    else if (e.getSource() == saveMenu) {
        int returnVal = chooser.showSaveDialog(Simulator.this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();

            String fname = file.getAbsolutePath();

            if(!fname.endsWith(".xml") ) {
                file = new File(fname + ".xml");

            if(!file.createNewFile()) {
                /*check with user??*/
            }
3
7stud

Tu devrais essayer ça. Je l'ai fait et ça a marché.

FileOutputStream fileOut =  new FileOutputStream(file1+".xml");
hwb.write(fileOut);
fileOut.close();
System.out.println("\n Your file has been generated!");
JOptionPane.showMessageDialog(this,"File Created.");
0
Aparna Pathak

Vous devriez essayer ceci:

if(!file.getName().contains(".")) file = new File(file.toString() + ".xml");
0
user8642840