Avatar billede phineas_phreak Nybegynder
17. januar 2005 - 19:42 Der er 10 kommentarer og
1 løsning

vælg filtype ved gem og åben

Hej ...
Hvordan restricter man valg af filtype under JfileChooser når man skal gemme / åbne en fil ?
Altså ikke blabla.endsWith("aaa") men selve menuen nedenunder hvor man vælger hvilken extension filen man er i gang med at hente/åbne skal have

På forhånd tak.
Avatar billede martinbk Nybegynder
17. januar 2005 - 20:23 #1
det gøres ved at lave en instans af den abstrakte klasse FileFilter og herefter sætte den på din JFileChooser med object.setFileFilter();

jeg kan godt grave et eksempel frem hvis du vil have det
Avatar billede phineas_phreak Nybegynder
17. januar 2005 - 20:26 #2
ja tak...
Avatar billede martinbk Nybegynder
17. januar 2005 - 20:32 #3
// selve filteret her //

import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.filechooser.FileFilter;

public class ProjFileFilter extends FileFilter {
    private Hashtable filters = null;
    private String description = null;
    private String fullDescription = null;
    private boolean useExtensionsInDescription = true;
   
    protected ProjFileFilter() {
        this.filters = new Hashtable();
    }
   
    protected ProjFileFilter(String extension) {
        this(extension, null);
    }
   
    protected ProjFileFilter(String extension, String description) {
        this();
        if (extension != null)
            addExtension(extension);
        if (description != null)
            setDescription(description);
    }
   
    /**
    * Metode brugt til at definere om filen skal vises i JFileChooseren
    * Defineret i den Abstrakte klasse FileFilter og derfor et krav til klassen
    *
    * @return true hvis extension eksistere i filteret ellers false
    */
    public boolean accept(File f) {
        if (f != null) {
            if (f.isDirectory()) {
                return true;
            }
            String extension = getExtension(f);
            if (extension != null && filters.get(getExtension(f)) != null) {
                return true;
            }
        }
        return false;
    }
   
    /**
    * Retunere Extension på den givne fil
    * 
    * @return Fil extension
    */
    public String getExtension(File f) {
        if (f != null) {
            String filename = f.getName();
            int i = filename.lastIndexOf('.');
            if (i > 0 && i < filename.length() - 1) {
                return filename.substring(i + 1).toLowerCase();
            }
        }
        return null;
    }
    /**
    * Tilføjer en extension til Hashtabellen indeholdende alle extensions
    * 
    */
    public void addExtension(String extension) {
        if (filters == null) {
            filters = new Hashtable();
        }
        filters.put(extension.toLowerCase(), this);
        fullDescription = null;
    }
   
    /**
    * udformer et læsbart output brugt i JFileChooseren,
    * metoden er defineret i den abstrakte klasse FileFilter,
    * og derfor et krav til klassen
    */
    public String getDescription() {
        if (fullDescription == null) {
            if (description == null || isExtensionListInDescription()) {
                fullDescription = description == null ? "(" : description
                        + " (";
                Enumeration extensions = filters.keys();
                if (extensions != null) {
                    fullDescription += "." + (String) extensions.nextElement();
                    while (extensions.hasMoreElements()) {
                        fullDescription += ", ."
                                + (String) extensions.nextElement();
                    }
                }
                fullDescription += ")";
            } else {
                fullDescription = description;
            }
        }
        return fullDescription;
    }
   

    public void setDescription(String description) {
        this.description = description;
        fullDescription = null;
    }
   

    public void setExtensionListInDescription(boolean b) {
            useExtensionsInDescription = b;
            fullDescription = null;
    }

    public boolean isExtensionListInDescription() {
            return useExtensionsInDescription;
    }
}

// standard file chooser klasse //

public class Dialog {
   
    private static ProjFileFilter filter = new ProjFileFilter();
   
    public static String displayOpenFileChooser() {
        JFileChooser jfc = new JFileChooser();
        filter.addExtension("proj");
        filter.setDescription("Projekt filer");
        jfc.setFileFilter(filter);
        int returnVal = jfc.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            return jfc.getSelectedFile().getAbsolutePath();
        }
        else {
            return null;
        }
    }
}
Avatar billede phineas_phreak Nybegynder
17. januar 2005 - 21:16 #4
er det virkeligt nødvendigt med alt det bare for fx. kun at have .txt i det der rulle-panel under det sted hvor man skriver filnavn? der skal bare stå ".txt" i stedet for "alle filer"
Avatar billede di8leva Nybegynder
18. januar 2005 - 10:51 #5
Her er et lidt nemmere eksempel

De behøver måske ikke bruge både "extends FileFiler" og "implements FilenameFilter", men jeg bruger dette filter på flere forskellige steder, så jeg behøver det :)

--------------------------------------
public class EasyFileNameFilter extends FileFilter implements FilenameFilter
{

    public boolean accept(File dir, String name)
    {
        return name.endsWith(".txt");
    }
   
    public boolean accept(File f)
    {
        if(f.isDirectory())
            return true;
        return f.toString().endsWith(".txt");
    }

    public String getDescription()
    {
        return "tekstfiler";
    }
}
Avatar billede martinbk Nybegynder
18. januar 2005 - 11:36 #6
di8leva ->

den kode du præsentere der er i mine øjne meget ufuldkommen og fjerner en del af fordelene ved Object Orienteret programmering, med den løsning er du nød til at lave en ny klasse hver eneste gang du vil have en ny filtype, min kode er skrevet til generelt brug, den kan instansieres til enhver filtype og kan også indeholde flere filtyper i et filter....

/Martin
Avatar billede martinbk Nybegynder
18. januar 2005 - 11:44 #7
mht. din tvivl omkring FileFilter og FilenameFilter.

FileFilter er en abstrakt klasse som implementere interfacet FilenameFilter, da du arver fra FileFilter har du allerede sikret at du overholder den adfærd som interfacet FilenameFilter tilbyder, så konklusion: FilenameFilter er overflødig
Avatar billede di8leva Nybegynder
18. januar 2005 - 11:59 #8
martinbk ->

Ok, du har ret det. Selv bruger jeg en klasse der tar fil-endelsen som input til konstruktorn. Men før at gøre klassen så nem som muligt før phineas som kun vil ha text-filer så gjorde jeg den mindre.

Med hensyn til FilenameFilter. FileFilter implementerer ikke FilenameFilter, så hvis jeg fjerner "implements FilenameFilter" så virker ikke:
-------------------
File f = new File(directory);
String[] names = f.list(new EasyFileNameFilter(fileEnding));
-------------------
Den siger "The method list() is not applicable...... yaddayadda"
Avatar billede martinbk Nybegynder
18. januar 2005 - 12:07 #9
hmm ja du har ret mht. filenamefilter, men må jeg spørge hvor det kommer ind i billedet i forhold til ovenstående spørgsmål, JFileChooseren sørger selv for at liste de filer den skal bruge udfra det filter du laver (som netop extender FileFilter) ?
Avatar billede di8leva Nybegynder
18. januar 2005 - 12:09 #10
:)
Jeg mente at jeg bruger både FileFilter og FilenameFilter i min kode. Og då jeg ikke kunde huske hvilken af dem jeg brugte til JFileChooser så læt jeg bægge to vara kvar.
Avatar billede phineas_phreak Nybegynder
18. januar 2005 - 21:02 #11
undskyld ventetiden, havde fået løst det i mellemtiden, men det var med metoden som di8leva paster i sit indlæg lidt højere oppe, så pointene tilfalder ham.

tak for opmærksomheden
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester