# jfilechooser setcurrentdirectory



## sunny (20. Nov 2003)

hallo,
hab folgendes problem:

ich setze beim filechooser das aktuelle directory:

```
fChooser.setCurrentDirectory(new File("."));
```

beim 1. mal aufrufen setz er mir den 'punkt' um auf
das aktuelle dir. in meinem fall 'test'.
im dialogfenster von filechooser erscheinen alle dir + files
vom directory test.

beim 2. mal bleibt das dialogfenster leer. er übersetzt 
den punkt nicht mehr auf 'test', sondern er nimmt den
punkt als aktuelles dir.

hier ein miniprogramm, um den fehler anschaulich zu machen:

```
import javax.swing.JFileChooser;
import java.io.File;
import javax.swing.JFrame;

public class Test {
  public static void main(String[] args) {
    new f();
  }
}

class f extends JFrame {
  File pfad = new File("");
  private JFileChooser fChooser = new JFileChooser();
  public f() {
    for (int i=0; i<2; i++) {
      testMethode();
    }
  }
  private void testMethode() {
    fChooser.setCurrentDirectory(new File("."));
    pfad = fChooser.getCurrentDirectory();
    System.out.println(pfad.getName());
  }
}
```

beim 1.mal println druckt er test aus (ist auch richtig),
beim 2.mal println druckt er einen punkt (.) aus ????

wo liegt der fehler?

danke erst mal für die hilfe.

sunny


----------



## Ebenius (20. Nov 2003)

Hier sollte es sich um einen Bug im SDK handeln, den Du aber leicht umgehen kannst. Das Problem tritt exakt dann auf, wenn Du das gleiche Verzeichnis zweimal hintereinander setzt, jedoch _File.equals()_ nicht _true_ zurück gibt.

Das ganze passiert dann, wenn das _currentDirectory_ zum Beispiel "C:\Temp" heißt und Du es auf "C:\Temp\.\" setzt. _File.equals()_ gibt hier _false_ zurück, obwohl das gleiche Verzeichnis beschrieben wird.

Du kannst diesen Effekt sehr leicht umgehen, indem Du das _currentDirectory_ im _JFileChooser_ stets mit kanonischen Pfaden setzt.


```
File.getCanonicalFile()
```
Wenn Du das stets tust, dann ist auch _File.equals() = true_ für inhaltlich gleiche Dateien/Verzeichnisse.

Hab vor ner Weile das gleiche Problem gehabt und es untersucht. Ärgerlich - aber einfach zu umgehen. Am besten JFileChooser ableiten, dann kann nichts passieren. *So gehts!*:


```
import java.io.File;
import java.io.IOException;

import javax.swing.filechooser.FileSystemView;

class JFileChooser extends javax.swing.JFileChooser
{
	public JFileChooser()
	{
		super();
	}

	public JFileChooser(File currentDirectory)
	{
		super(currentDirectory);
	}

	public JFileChooser(File currentDirectory, FileSystemView fsv)
	{
		super(currentDirectory, fsv);
	}

	public JFileChooser(String currentDirectoryPath)
	{
		super(currentDirectoryPath);
	}

	public JFileChooser(String currentDirectoryPath, FileSystemView fsv)
	{
		super(currentDirectoryPath, fsv);
	}

	public JFileChooser(FileSystemView fsv)
	{
		super(fsv);
	}

	/**
	 * Overridden to ensure canonical paths.
	 * @param dir The directory to set
	 * @see javax.swing.JFileChooser#setCurrentDirectory(java.io.File)
	 */
	public void setCurrentDirectory(File dir)
	{
		if (dir != null)
		{
			try
			{
				dir = dir.getCanonicalFile();
			}
			catch (IOException e)
			{
				dir = dir.getAbsoluteFile();
			}
		}

		super.setCurrentDirectory(dir);
	}
}
```

Viel Spaß, Ebenius


----------



## sunny (21. Nov 2003)

dank an Ebenius für seine ausführliche beschreibung (lösung).

da ich java-anfänger bin, werde ich diesen vorschlag später mal in
ruhe ausprobieren (kanonische pfade habe ich noch nie gehört).

momentan habe ich das problem so gelöst, dass ich bei jedem
filechooser-aufruf ein neues objekt erstelle und beim schließen
wieder lösche (=null):

      fChooser = new JFileChooser();
      fChooser.setCurrentDirectory(new File("."));
      int result = fChooser.showOpenDialog(MenueFenster.this);
      fChooser = null;


funktioniert, ist aber keine gute lösung.

nochmals danke Ebenius.
Sunny


----------

