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.
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); } } }
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å?
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); } } }
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.
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 } });
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å.
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.