2012-09-24 15 views
7

Używam FileDialog do zapisywania i ładowania w programie Java.Jak filtrować typ pliku w FileDialog?

Jak mogę filtrować listę rozwijaną, aby określić typ pliku jako "JPG" lub "JPEG" itp.?

Próbowałem następujący kod, ale wydaje się, że nie ma wpływu.

Czy są na to inne sposoby?

public void actionPerformed(ActionEvent e) { 
      FileDialog saveFileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE); 

      saveFileDialog.setFilenameFilter(new FilenameFilter(){ 
       @Override 
       public boolean accept(File dir, String name) { 
        return name.endsWith(".jpg") || name.endsWith(".jpeg"); 
       } 
      }); 
      saveFileDialog.setFile("Untitled.jpg"); 
      saveFileDialog.setVisible(true); 
     } 

Odpowiedz

0

Zawsze używany JFileChooser zamiast FileDialog. Następnie można dodać wiele ChoosableFileFilters dla różnych rodzajów Twój program będzie wspierał w ten sposób:

File myFilename; 
chooser = new JFileChooser(); 
chooser.addChoosableFileFilter(new OpenFileFilter("jpeg","Photo in JPEG format")); 
chooser.addChoosableFileFilter(new OpenFileFilter("jpg","Photo in JPEG format")); 
chooser.addChoosableFileFilter(new OpenFileFilter("png","PNG image")); 
chooser.addChoosableFileFilter(new OpenFileFilter("svg","Scalable Vector Graphic")); 
int returnVal = chooser.showSaveDialog(mainWindow); 
if (returnVal == JFileChooser.APPROVE_OPTION) { 
    myFilename = chooser.getSelectedFile(); 
    //do something with the file 
} 

Poniżej jest moja implementacja FileFilter.

/** 
* This class defines which file types are displayed (by default) by the JFileChooser and what file 
* types appear in the drop down menu in the file dialog. 
* You could add more than one file type to the open file dialog by creating multiple instances of this 
* class and then repeatedly calling addFileFilter. 
* @author LaSpina 
*/ 

import java.io.File; 
import javax.swing.filechooser.*; 

public class OpenFileFilter extends FileFilter { 

    String description = ""; 
    String fileExt = ""; 

    public OpenFileFilter(String extension) { 
     fileExt = extension; 
    } 

    public OpenFileFilter(String extension, String typeDescription) { 
     fileExt = extension; 
     this.description = typeDescription; 
    } 

    @Override 
    public boolean accept(File f) { 
     if (f.isDirectory()) 
      return true; 
     return (f.getName().toLowerCase().endsWith(fileExt)); 
    } 

    @Override 
    public String getDescription() { 
     return description; 
    } 
} 
+0

ok ... i podjęłam decyzję o zastosowaniu tego podejścia ... dziękuję bardzo ~ –

+0

Nie powinieneś uwzględniać okresu w argumencie rozszerzenia do konstruktora 'OpenFileFilter', aby' plik.notJpg' nie został zaakceptowany? –

+0

Tak, powinienem. Dziękuję Ci. – Thorn

2

To też nie działa dla mnie. Filename filters do not function in Sun's reference implementation for Microsoft Windows.

Zamiast tego możesz wypróbować poniższy kod. Należy również usunąć setFilenameFilter udział:

saveFileDialog.setFile("*.jpg"); 
+0

po prostu ustawia oszczędności nazwę pliku domyślnie, ale to nic nie zmienia się na liście rozwijanej ... –

+0

tak, ale działa, ponieważ nie pozwala zobaczyć plików z innymi rozszerzeniami. – RGO

+0

czego chcę, to czy są jakieś alternatywy, które mogę określić zawartość listy rozwijanej? –

8

Odpowiedź jest prosta. Można użyć

saveFileDialog.setFile("*.jpg;*.jpeg"); 

Nie trzeba używać setFilenameFilter metody. Możesz dodać dowolną liczbę typów plików.

Rozwiązanie tego problemu można znaleźć w komentarz huxhorn w Bug ID: 4031440 FileDialog doesn't call FilenameFilter.accept().

public void actionPerformed(ActionEvent e) { 
      FileDialog saveFileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE); 
      saveFileDialog.setFile("*.jpg;*.jpeg"); 
      saveFileDialog.setVisible(true); 
     } 
+0

Wygląda na to, że można użyć co najwyżej dwóch ciągów znaków. Spróbuj użyć pięciu, a getFile zwróci złe informacje po wyborze. – SOUser

+0

Zgodnie z postem SO, http://stackoverflow.com/questions/14972664, na co złożyłem skargę, jest błąd w JDK 7. – SOUser

-1

Począwszy Java 8 można wyrażenie lambda:

fileDialog.setFilenameFilter((File dir, String name) -> name.endsWith(".html"));

+0

To po prostu nie działa w systemie Windows –