# File.listFiles() mit dem FileFilter von JFileChooser?



## Mossos (6. Mai 2008)

Hallo zusammen!

Ich habe vor, einen gefilterten File-Array eines, mit dem JFileChooser ausgewählten Ordners, zu erstellen:

```
JFileChooser fc = new JFileChooser() {

[. . .] //Implementierung der Filter etc.

File ordner = fc.getSelectedFile();   //der ausgewählte Ordner
FileFilter filter= fc.getFileFilter();     // der aktuell ausgewählte Filter

fileArr = new File[ordner.listFiles(filter).length - 1]; //Das Array mit der bedürftigen Länge erstellen
fileArr = ordner.listFiles(filter); //Array füllen

[. . .]
```

Leider hab ich dabei das Problem, dass bei dem Befehl .listFiles(filter) folgender Fehler auftritt:
*The method listFiles(FilenameFilter) in the type File is not applicable for the arguments (FileFilter)*
Obwohl man normalerweise listFiles(FileFilter) benutzen kann. Ich denke mal das hängt damit zusammen dass der FileFilter vom JFileChooser von der javax.swing.filechooser.FileFilter - Klasse kommt. Allerdings hab ich keine Idee, wie ich den ausgewählten Ordner mit dem ausgewählten Filter filtern kann (Hoffe das war jetzt nicht zu kompliziert erklärt ). 
Hat jemand ne Idee/Lösung ??

Danke im Voraus!
MfG Mossos[/b]


----------



## Wildcard (6. Mai 2008)

Schreib dir doch eine Wrapperklasse.


----------



## Triebi (6. Mai 2008)

Mossos hat gesagt.:
			
		

> ```
> [. . .]
> //Implementierung der Filter etc.
> [. . .]
> ```


Wenn du die Filter selbst schreibst, müsste IMHO ein Kontrukt in Form von
	
	
	
	





```
class MyFileFilter extends javax.swing.filechooser.FileFilter implements  java.io.FileFilter
```
funktionieren.


----------



## Mossos (6. Mai 2008)

hm von Wrapper-Klassen hab ich noch keine Ahnung, hab jezz auf die schnelle auch nix gefunden was mir dafür helfen könnte..aber ich probiers mal..meld mich dann vll nomma
aber schonmal vielen dank![/quote]


----------



## Mossos (6. Mai 2008)

Also ich hab jezz die eigene FilterKlasse CostumFilter erstellt:

```
public class CostumFilter extends javax.swing.filechooser.FileFilter implements java.io.FileFilter {
	

	@Override
	public boolean accept(File f) {
		return f.isDirectory()
				|| f.getName().toLowerCase().endsWith(".txt");
	}

	@Override
	public String getDescription() {
		return "Texte";
	}
}
```

und im JFileChooser sieht das dann so aus:

```
fc.setFileFilter(new CostumFilter());
		
		fc.setFileFilter(new CostumFilter() {
			@Override
			public boolean accept(File f) {
				return f.isDirectory()
						|| f.getName().toLowerCase().endsWith(".mp3")
						|| f.getName().toLowerCase().endsWith(".wmv")
						|| f.getName().toLowerCase().endsWith(".wav")
						|| f.getName().toLowerCase().endsWith(".ogg")
						|| f.getName().toLowerCase().endsWith(".mid")
						|| f.getName().toLowerCase().endsWith(".midi");
			}

			@Override
			public String getDescription() {
				return "Musikdateien";
			}
		});
```
aber es kommt immernoch das gleiche problem.. :/
hab ich irgendwas falsch gemacht?


----------



## Triebi (6. Mai 2008)

Also bei diesem kleinen Beispiel gibt es nix zu meckern:
	
	
	
	





```
import java.io.*;
import javax.swing.*;

class CostumFilter extends javax.swing.filechooser.FileFilter implements java.io.FileFilter {
   @Override public boolean accept(File f) {return true;}
   @Override public String getDescription() {return "aales";}
}

class FileFilterTest {
	public static void main(String[] args) {
		JFileChooser fs = new JFileChooser();
		CostumFilter cf = new CostumFilter();
		fs.setFileFilter(cf);
		new File("/").listFiles(cf);
	}
}
```

Mir ist aber gerade dieses aufgefallen:


			
				Mossos hat gesagt.:
			
		

> *The method listFiles(FilenameFilter) in the type File is not applicable for the arguments (FileFilter)*


Es gibt mehrere listFiles():  
	
	
	
	





```
File[]  listFiles() 
           Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.

File[]  listFiles(FileFilter filter) 
           Returns an array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname that satisfy the specified filter.

File[]  listFiles(FilenameFilter filter) 
           Returns an array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname that satisfy the specified filter.
```
File*name*Filter ist wieder etwas anderes, irgendwie will dein Java die falsche Methode aufrufen.
Zeig' mal bitte mehr Code.


----------



## Mossos (6. Mai 2008)

ich zeig mal den ganzen JFileChooser:

```
public void getFileChooser(){
    	JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		
		if (fc.getFileSelectionMode() == 0){ //0 = FILES_ONLY
			fc.setMultiSelectionEnabled(true);
		}
		
		fc.setFileFilter(new CostumFilter());
		
		fc.setFileFilter(new CostumFilter() {
			@Override
			public boolean accept(File f) {
				return f.isDirectory()
						|| f.getName().toLowerCase().endsWith(".mp3")
						|| f.getName().toLowerCase().endsWith(".wmv")
						|| f.getName().toLowerCase().endsWith(".wav")
						|| f.getName().toLowerCase().endsWith(".ogg")
						|| f.getName().toLowerCase().endsWith(".mid")
						|| f.getName().toLowerCase().endsWith(".midi");
			}

			@Override
			public String getDescription() {
				return "Musikdateien";
			}
		});

		int state = fc.showOpenDialog(null);

		if (state == JFileChooser.APPROVE_OPTION) {
			
	//////////////////// Hier der wichtige Teil //////////////////////////
			
			if (fc.getFileSelectionMode() == 1) { //1 = DIRECTORIES_ONLY
				File ordner = fc.getSelectedFile();
				
				FileFilter moep = fc.getFileFilter();
				System.out.println(moep.getDescription());
				fileArr = new File[ordner.listFiles(moep).length - 1];
				fileArr = ordner.listFiles();
				filldir();
				
	//////////////////////////////////////////////////////////////////////			
				
			} else if (fc.getFileSelectionMode() == 0) { //0 = FILES_ONLY
				
				fileArr = fc.getSelectedFiles();
				filldir();
			}
			

		} else System.out.println("Auswahl abgebrochen");
	}
```


----------



## Mossos (6. Mai 2008)

Hab auch ma versucht nach CostumFilter zu casten:


```
CostumFilter moep = (CostumFilter) fc.getFileFilter();
fileArr = new File[ordner.listFiles(moep).length - 1];
```

Hierbei ist einmal das Problem, dass ne ClassCastException kommt wenn kein Filter im JFileChooserausgewählt wurde ("Alle Dateien") - was man ja noch beheben könnte. Allerdings funktionieren die Filter trotzdem nicht wirklich. Entweder werden trotzdem alle Dateien angezeigt (oder es gibt nen Laufzeitfehler, wenn keine Textdatei im Ordner ist - aber das ist meine Schuld und kein problem: NegativeArraySizeException siehe Zeile 2).
Ich versteh nur nicht wieso der Filter dann nicht funzt..beim cast verschwindet doch nix vom eigentlichen Filter oder??


----------



## Mossos (6. Mai 2008)

ääh sry meinte: siehe Zeile *3*


----------



## Triebi (6. Mai 2008)

Zunächst die einfachen Dinge: 





			
				Mossos hat gesagt.:
			
		

> ```
> fileArr = new File[ordner.listFiles(moep).length - 1];
> ```
> NegativeArraySizeException


Das ist überflüssig, da fileArr in der darauf folgenden Zeile ein neues Array der richtigen Größe zugewiesen wird -> löschen.



			
				Mossos hat gesagt.:
			
		

> Hab auch ma versucht nach CostumFilter zu casten:
> 
> 
> 
> ...


Kein Wunder, dieser Standardfilter ist kein Objekt von CostumFilter. Mit 
	
	
	
	





```
fc.setAcceptAllFileFilterUsed(false);
```
kannst du ihn (zumindest bis zu einer besseren Lösung) ausblenden.

Mal wieder  zurück zum ursprünglichen Problem:
*The method listFiles(FilenameFilter) in the type File is not applicable for the arguments (FileFilter)*
konnte ich hier bisher nicht rekonstruieren. Schreib' doch mal an den Anfang deiner main-Methode diese Zeilen 
	
	
	
	





```
java.lang.reflect.Method[] m = File.class.getDeclaredMethods();
	for (int i = 0; i < m.length; i++) {
		String s = m[i].toString();
		if (s.contains("listFiles")) { System.out.println(s);}
	}
```
und zeig' die zugehörige Ausgabe.


----------



## Mossos (7. Mai 2008)

Die Ausgabe ist:
public java.io.File[] java.io.File.listFiles()
public java.io.File[] java.io.File.listFiles(java.io.FilenameFilter)
public java.io.File[] java.io.File.listFiles(java.io.FileFilter)


----------



## Mossos (7. Mai 2008)

Triebi hat gesagt.:
			
		

> Mal wieder  zurück zum ursprünglichen Problem:
> *The method listFiles(FilenameFilter) in the type File is not applicable for the arguments (FileFilter)*
> konnte ich hier bisher nicht rekonstruieren.



Willst du damit sagen, dass du meine Methode implementiert hast und bei dir nicht der Fehler kommt???


----------



## Mossos (7. Mai 2008)

Anscheinend ist FileFilter nicht gleich FileFilter..
Wenn ich folgendes deklariere:

```
java.io.FileFilter filter = fc.getFileFilter();
```
Spuckt eclipse diese Fehlermeldung aus:
*Type mismatch: cannot convert from FileFilter to FileFilter*

Mir sind jetzt echt die Ideen ausgegangen. Hat vll noch jmd ne Ahnung wie ich den ausgewählten Filter im JFileChooser in die listFiles()-Methode bekomme?


----------



## Triebi (7. Mai 2008)

Mossos hat gesagt.:
			
		

> Die Ausgabe ist:
> public java.io.File[] java.io.File.listFiles()
> public java.io.File[] java.io.File.listFiles(java.io.FilenameFilter)
> public java.io.File[] java.io.File.listFiles(java.io.FileFilter)


Hmm, alles da.



> Willst du damit sagen, dass du meine Methode implementiert hast und bei dir nicht der Fehler kommt???


Genau.



> Type mismatch: cannot convert from FileFilter to FileFilter


Ein javax.swing.filechooser.FileFilter ist erstmal absolut gar nicht mit einem java.io.FileFilter verwandt. Das ist hier das Problem - oder zumindest eins davon. Daher mein Vorschlag, in einer eigenen Klasse beide zu erweitern / implementieren.



> Hat vll noch jmd ne Ahnung wie ich den ausgewählten Filter im JFileChooser in die listFiles()-Methode bekomme?


Also ich bräuchte erstmal eine Ahnung, warum bei dir versucht wird, listFiles(java.io.File*name*Filter) aufzurufen. Ein File*name*Filter ist wieder etwas vollkommen anderes.



> Mir sind jetzt echt die Ideen ausgegangen.


Mir auch...


----------



## Guest (7. Mai 2008)

Ich hab auch überhaupt keine ahnung wieso der denkt in listFiles() nen FilenameFilter erwartet..der spinnt doch ^^

Naja ich hab das jezz einigermaßen hinbekommen..zwar nicht perfekt und was umständlich, aber vorerst reicht mir das:

```
File ordner = fc.getSelectedFile();
if(fc.getFileFilter().getDescription() == "Alle Dateien") { //Falls kein spezieller Filter gewählt ist:
	fileArr = ordner.listFiles();  //dann das Array ohne Filter füllen - ganz normal
} else {   //Wenn ein bestimmter Filter ausgewählt ist:

	//dann den JFileChooser-FileFilter nach java.ioFileFilter casten
	java.io.FileFilter filter = (java.io.FileFilter) fc.getFileFilter();  
	fileArr = ordner.listFiles(filter);   //und Array mit diesem Filter dann füllen
}
```

Also soweit funktioniert das alles...das einzige was jetzt net so doll ist, ist dass trotz ausgewählten Filter, die Unterordner vom ausgewählten Ordner angezeigt werden, obwohl die ja garkeine Endung haben. Aber man kann ja nicht alles haben ^^,  vll ist das auch normal ka..
Vielen Dank für die Hilfe Triebi!


----------

