2011-02-28 28 views
8

Estoy usando java.awt.FileDialog para crear un cuadro de diálogo para guardar un archivo. El problema es que cuando especifico un nombre de archivo sugerido (predeterminado), FileDialog elimina su extensión. Ejemplo:Guardar FileDialog en Java elimina la extensión de archivo inicial

import java.awt.*; 
import java.io.*; 

public class SaveFile { 
    public static void main(String[] args) { 
     FileDialog fileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE); 
     fileDialog.setFilenameFilter(new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       return name.endsWith(".txt"); 
      } 
     }); 
     fileDialog.setFile("Untitled.txt"); 
     fileDialog.setVisible(true); 
     System.out.println("File: " + fileDialog.getFile()); 
    } 
} 

que sería de esperar que cuando aparece el FileDialog, el nombre de archivo por defecto es "Untitled.txt", sino que es simplemente "Sin título". Cuando los usuarios hacen clic en Guardar, obtengo un nombre de archivo sin la extensión. FileDialog hace esto en Windows y OS X.

No lo entiendo. ¿Por qué FileDialog deliberadamente quitaría la extensión? ¿Hay alguna razón lógica para esto? La documentación no lo discute. Como solución, yo podría simplemente añadir la extensión de la cadena que devuelve FileDialog, pero aún así, esto parece ser un error ...

(Tenga en cuenta que no puedo usar JFileChooser;. Necesito el AWT FileDialog nativo)

Respuesta

2

Esto no me sucede a mí, en Windows 7, con Sun Java 1.5 y 1.6.

El comportamiento que obtengo depende ligeramente de la configuración de "Ocultar extensiones de tipos de archivos conocidos" en el Explorador de Windows. Si está activado, entonces no veo la extensión en el cuadro de diálogo del archivo, como es de esperar, pero me devuelve el nombre completo del archivo.

EDITAR: Me doy cuenta de que estaba equivocado acerca de AWT y widgets nativos - confunden AWT y Swing.

+0

Gracias por la información. De hecho, es cierto que el comportamiento en Windows depende de la configuración "Ocultar extensiones". Y tiene razón, devuelve el nombre del archivo con la extensión, incluso si "Ocultar extensiones" está activado y el usuario no agrega explícitamente la extensión. – vocaro

+0

El problema parece estar aislado de la versión para Mac de Java. La Mac también tiene una configuración de "Ocultar extensiones"; sin embargo, si esa configuración está activada, la extensión está oculta en el campo de texto del diálogo, pero la cadena devuelta NO incluye la extensión. Este es claramente un error multiplataforma, así que presentaré un informe con Apple. De nuevo, gracias por tu ayuda. – vocaro

+0

@vocaro ¿Archivó un informe? Cualquier enlace? ¿Cómo resolviste este problema? – Igor

2

He estado buscando una respuesta a este mismo problema que aparece solo en Mac. Tienes que vivir con la opción fea de JFileChooser (swing, peso ligero, aspecto no nativo), o tener un if (os es mac) y manejar las cosas de manera diferente colocando la extensión de archivo al final tú mismo.

Es un error Mac Java AWT que con suerte se solucionará en algún momento.

-1

Uso JFileChooser, pero puesto que al inicio del programa:

try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
1

Aquí es un ejemplo de cómo guardar un nuevo archivo en el directorio y el nombre del archivo desde FileDialog especificada, cuerdas tomadas de un vector de Cuerdas. ¡Funciona para mí!

public static void SaveFileTo(Vector<String> myLines) { 
     FileOutputStream f = null; 
     DataOutputStream h = null; 
     FileDialog d = new FileDialog(new JFrame(), "Save", FileDialog.SAVE); 
     d.setVisible(true); 
     String dir; 
     dir = d.getDirectory(); 
     File oneFile = new File(dir + d.getFile()); 
     try { 
      oneFile.createNewFile(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try { 
      f = new FileOutputStream(oneFile); 
      h = new DataOutputStream(f); 
      for (String de : myLines) { 
       h.writeBytes(de);    
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally { 
      try { 
       h.close(); 
       f.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
Cuestiones relacionadas