Avatar billede nielsbrinch Nybegynder
23. januar 2002 - 15:00 Der er 14 kommentarer og
1 løsning

JFileChooser med FileFilter

Jeg kan med JBuilder's komponent, JFileChooser, fremskaffe en dialogboks hvor brugeren kan vælge en bestemt fil på sin computer.

Jeg søger at brugeren kun skal se lige præcis den fil han leder efter - f.eks. "fil.exe" ... alle andre filer skal skjules.

Jeg har prøvet med følgende, og mener at jeg er på sporet:

File myFile = new File("fil.exe");
jFileChooser1.setFileFilter(FileFilter.accept(myFile));

...men det virker ikke - den vil ikke engang kompilere det der, fordi jeg tydeligvis har misforstået FileFilter.accept.

Hvad skal jeg gøre for at det virker som jeg ønsker det?
Avatar billede el_gnu Nybegynder
23. januar 2002 - 15:39 #1
Du er nødt til at lave en instans af klassen:

jFileChooser1.setFileFilter(new FileFilter() {
  public boolean accept(java.io.File f) {
    if (f.isFile() && f.getName().equals("fil.exe")) return true;
    else return false;
  }
});
Avatar billede nielsbrinch Nybegynder
23. januar 2002 - 16:10 #2
Tak for svaret. Det var hjælpsomt på den måde at jeg fandt ud af at det nok er lidt uden for min liga - eller også var der en eller anden form for fejl i koden jeg fik. Hele funktionen ser sådan ud, og fungerer uden FileFilter-linjen:

  public void requestCsPath()
  {
    if (S.nida.csPath == null)
    {
      message("First time?", "There is no path to Counter-Strike set, and you need to set one before you can use the program");
      jFileChooser1.setDialogTitle("Path to Counter-Strike (hl.exe or cstrike.exe for retail version)");
      if (JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)) {
        jFileChooser1.setFileFilter(new FileFilter()
        {
          public boolean accept(java.io.File f)
          {
            if (f.isFile() && f.getName().equals("hl.exe"))
              return true;
            else
              return false;
          }
        });
        S.nida.csPath = jFileChooser1.getSelectedFile().getPath();
        csPath.setText(S.nida.csPath);
      }
      else
      {
        System.exit(0);
      }
    }
  }

Jeg får følgende kompileringsfejl:

"Mainframe.java": Error #: 300 : method setFileFilter(nida.Mainframe.requestCsPath.14) not found in class javax.swing.JFileChooser at line 244, column 21

Jeg kan ganske enkelt ikke gennemskue den linje du sendte mig, da den er sat op på en måde som er uvant for mig.
Avatar billede nielsbrinch Nybegynder
23. januar 2002 - 16:12 #3
(jeg har i øvrigt prøvet at placere FileFilter-linjen forskellige steder, men med samme resultat)
Avatar billede el_gnu Nybegynder
23. januar 2002 - 16:29 #4
Den skrivemåde jeg bruger er i stedet for at skrive en seperat klasse der extender javax.swing.FileFilter
Når man skriver

new klasseNavn()

efterfulgt af

{//noget kode}

så bliver det der står mellem tuborg-parenteserne tilføjet til instansen af klassen. Når jeg skriver funktionen accept(File) her, betyder det at denne funktion skal bruges i stedet for den der normalt er i klassen FileFilter (der er abstract). Inde i den metode kan du så undersøge den fil der er givet som parameter og returnere true hvis den skal vises.
Det lyder umiddelbart somom din filechooser også skal vise mapper, og så skal den se sådan her ud:

public boolean accept(java.io.File f) {
  if (f.isDirectory()) return true;
  else if (f.getName().equals("hl.exe")) return true;
  else return false;
}


Du skal endvidere have sat dit FileFilter før du kalder jFileChooser1.showOpenDialog(this).

Umiddelbart vil jeg tro følgende virker

  public void requestCsPath()
  {
    if (S.nida.csPath == null)
    {
      message("First time?", "There is no path to Counter-Strike set, and you need to set one before you can use the program");
      jFileChooser1.setDialogTitle("Path to Counter-Strike (hl.exe or cstrike.exe for retail version)");
      jFileChooser1.setFileFilter(new FileFilter()
      {
        public boolean accept(java.io.File f) {
          if (f.isDirectory()) return true;
          else if (f.getName().equals("hl.exe")) return true;
          else return false;
        }
      });
      if (JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)) {
        S.nida.csPath = jFileChooser1.getSelectedFile().getPath();
        csPath.setText(S.nida.csPath);
      }
      else
      {
        System.exit(0);
      }
    }
  }
Avatar billede nielsbrinch Nybegynder
23. januar 2002 - 16:40 #5
Jeg prøvede at rette min kode som du sagde, og jeg prøvede at indsætte dit foreslag direkte - begge gange med samme fejl som før :-(

Men tak for hjælpen alligevel (indsend en svarbesked hvis du vil)
Avatar billede el_gnu Nybegynder
23. januar 2002 - 16:58 #6
fejlen kunne tyde på at du skal indsætte FileFilter's fulde navn altså javax.swing.filechooser.FileFilter.
Avatar billede el_gnu Nybegynder
23. januar 2002 - 18:35 #7
Fik du det til at virke?
Avatar billede nielsbrinch Nybegynder
23. januar 2002 - 18:37 #8
Et lille spørgsmål, jeg ser du bruger "else if", har jeg ret i at det er af ren kosmetisk betydning, og der lige så godt kunne stå if?
Avatar billede el_gnu Nybegynder
23. januar 2002 - 20:34 #9
ja, det er ligegyldigt når metoden returnerer hvis en af betingelserne er sande
Avatar billede nielsbrinch Nybegynder
24. januar 2002 - 14:21 #10
Nej, jeg fik det aldrig til at virke :-(

Jeg synes fejlmeddelelsen tyder på at der ikke nødvendigvis er noget galt med selve den kode jeg har fået af dig, men at den ikke forstår det - måske en formalitet.

Er der eventuelt en mindre "smart" måde at gøre det på?
Avatar billede el_gnu Nybegynder
24. januar 2002 - 16:18 #11
Prøvede du med FileFilters fulde navn?
Altså:

  public void requestCsPath()
  {
    if (S.nida.csPath == null)
    {
      message("First time?", "There is no path to Counter-Strike set, and you need to set one before you can use the program");
      jFileChooser1.setDialogTitle("Path to Counter-Strike (hl.exe or cstrike.exe for retail version)");
      jFileChooser1.setFileFilter(new javax.swing.filechooser.FileFilter()
      {
        public boolean accept(java.io.File f) {
          if (f.isDirectory()) return true;
          else if (f.getName().equals("hl.exe")) return true;
          else return false;
        }
      });
      if (JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)) {
        S.nida.csPath = jFileChooser1.getSelectedFile().getPath();
        csPath.setText(S.nida.csPath);
      }
      else
      {
        System.exit(0);
      }
    }
  }
Avatar billede nielsbrinch Nybegynder
24. januar 2002 - 17:39 #12
Doh

Ja, jeg prøvede med den fulde sti, troede jeg ... jeg prøvede nemlig med javax.swing.filechooser.FileFilter ligesom du skrev, men glemte paranteserne efter FileFilter!

Det var løsningen på den fejl, men så kommer vi bare ud til en ny - den er dog lidt mere sædvanlig, men hænger vist sammen med den måde den anonyme klasse er oprettet:

"Mainframe.java": Error #: 454 : anonymous class of method requestCsPath() should be declared abstract; it does not define method getDescription() in class javax.swing.filechooser.FileFilter at line 335, column 7

Jeg har ikke kastet mig ud i at erklære den anonyme klasse abstrakt, da det så vidt jeg kan se, ikke er det virkelige problem ... og da jeg ikke ved hvordan, og efter eksperimenter har fundet ud af det ikke er ligetil.
Avatar billede el_gnu Nybegynder
25. januar 2002 - 09:52 #13
doh! det var mig der var lidt hurtig!
FileFilter har to abstrakte metoder accept og getDescription. Begge skal implementeres i den anonyme klasse.
Så prøv med følgende

      jFileChooser1.setFileFilter(new javax.swing.filechooser.FileFilter()
      {
        public boolean accept(java.io.File f) {
          if (f.isDirectory()) return true;
          else if (f.getName().equals("hl.exe")) return true;
          else return false;
        }
        public String getDescription() {
          return "(hl.exe) halflife"; // den her beskrivelse står i filechooseren
        }
      });
Avatar billede nielsbrinch Nybegynder
25. januar 2002 - 11:35 #14
d- d- d- doh!

Ja, det virker præcis som det skal! Du skal have mange tak for hjælpen - jeg havde aldrig fundet ud af det der selv, da jeg overhovedet ikke havde kendskab til den måde at skrive på.
Avatar billede el_gnu Nybegynder
25. januar 2002 - 16:06 #15
np :-)
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