# JFileChooser - Datei speichern



## Gast (31. Mai 2006)

Hallo,
ich suche nun schon eine halbe Stunde bei Google und hier, aber ich finde einfach nix was mir weiter hilft.

Ich möchte folgendes:
- Ein JFileChooser mit dem ich eine Datei speichern kann.
- Die Dateiendung kann zuvor über Buttons ausgewählt werden und steht danach in einem globalen String mit dem Namen dateityp. (Soll auch im JFileChooser unten anstatt "Alle Dateien" drinnstehen)
- Die zu speichernden Daten stehen in einem String mit dem Namen text.
- Der FileChooser soll immer wieder erscheinen, wenn man ihn schließen will ohne den Speichern-Button zu drücken.

Das habe ich bisher: (Wird über einen Button ausgeführt)

```
String text = "Test";
File datei;
JFileChooser fc = new JFileChooser(".");
fc.setDialogTitle("Exportieren - " + dateityp);

while(true) { // Wiederholen bis Speichern gedrückt wird
  int auswahl = fc.showSaveDialog(this);
  if (auswahl == fc.APPROVE_OPTION) {
    // Speichern wurde gedrückt
    break;
  }
  else continue; // Wiederholen
}
datei = fc.getSelectedFile();
if(datei.exists()) {
  // Frage, ob überschrieben werden soll
}
try {
  BufferedWriter bw = new BufferedWriter(new FileWriter(datei+dateiname+dateityp));
  bw.write(text);
  bw.close();
}
catch(Exception exSpeichern) {
  JOptionPane.showMessageDialog(this, "Fehler: "+exSpeichern.getMessage());
}
```

Kann mir bitte jemand weiterhelfen?


----------



## lhein (31. Mai 2006)

Was hast Du denn eigentlich für ein Problem? Du schreibst nur, dass Du ein Verhalten erreichen willst, postest ein Code-Sniplet und welche Problem jetzt auftritt, davon schreibst Du nichts.

lr


----------



## thE_29 (31. Mai 2006)

Um alle Dateien wegzubringen!

setAcceptAllFileFilterUsed(false);

Glaube ich halt (Namen hört sich stark danach an)


----------



## Guest (31. Mai 2006)

LR hat gesagt.:
			
		

> Was hast Du denn eigentlich für ein Problem? Du schreibst nur, dass Du ein Verhalten erreichen willst, postest ein Code-Sniplet und welche Problem jetzt auftritt, davon schreibst Du nichts.
> 
> lr



Stimmt, Sorry.

Also es ist so: Speichern tut er so schon und auch in das richtige Verzeichnis.

Was fehlt ist noch das:
  1. Ich will anstatt "Alle Dateien" den Dateityp, der in der Variable steht in dem Feld haben.
  2. Es soll eine Meldung erscheinen, die fragt ob er die Datei überschreiben soll, wenn es sie schon gibt.

Diese beiden Sachen bekomme ich irgendwie nicht hin.

Beim ersten braucht man einen FileFilter oder sowas, glaube ich mal. Aber wie geht das?

Also beim zweiten müsste ich ja nur das machen:

```
JOptionPane.showMessageDialog(this, "Datei überschreiben?");
```
Aber was bekomme ich als Rückgabewert, wenn man OK drückt?
Bei Abbrechen bekomme ich ja null, oder?
In was für eine Variable muss ich den Rückgabewert legen?
Stimmt die if-Bedingung (von meinem geposteten Quelltext) dazu?


----------



## L-ectron-X (31. Mai 2006)

Benutze auch mal die Suchfunktion!

Hier einer von vielen: http://www.java-forum.org/de/viewtopic.php?t=31839


----------



## Guest (1. Jun 2006)

L-ectron-X hat gesagt.:
			
		

> Benutze auch mal die Suchfunktion!
> 
> Hier einer von vielen: http://www.java-forum.org/de/viewtopic.php?t=31839



Das hatte ich auch schon gefunden, geht bei mir aber nicht.

Wenn ich diesen Code einbaue:

```
fc.setFileFilter( new FileFilter() { 
          public boolean accept( File f ) { 
            return f.isDirectory() || f.getName().toLowerCase().endsWith(dateityp); 
          } 
          public String getDescription() { 
            return "nur gewähltes Format"; 
          } 
        } );
```

Kommt bei mir folgende Fehlermeldung:


> Verweis auf FileFilter ist mehrdeutig; sowohl Klasse javax.swing.filechooser.FileFilter in javax.swing.filechooser als auch Klasse java.io.FileFilter in java.io stimmen überein



Und meine Variable, in der der Dateityp steht, geht auch nicht. Hier die Fehlermeldung:


> Auf lokale Variable dateityp wird aus einer verschachtelten Klasse heraus zugegriffen; sie muss als final deklariert sein



Aber ich kann sie nicht final deklarieren, weil man es ja sonst nicht auswählen kann welchen Dateityp man haben will.

Wie geht es dann?


----------



## L-ectron-X (1. Jun 2006)

Ich habe hier einen Bildbetrachter, der einen JFileChooser zum Öffnen bzw. Auswählen von bestimmten Dateitypen implementiert. Du solltest dort auch fündig werden. Vielleicht hilft's dir ja.
http://www.java-forum.org/de/viewtopic.php?p=139877#139877

Ach ja: Der Code funktioniert fehlerfrei.


----------



## thE_29 (1. Jun 2006)

Das Problem ist weil du wahrscheinlich "hirnlose" imports hast!


so wie import java.io.*;


Ist einfach net klug, weil du 1. sicher nie alle brauchst, 2tens dann solche Fehler kommen!


Dein Problem ist aber, das du 2 Klassen mit dem Namen JFileChooser importiert hast

Also müsstest du die imports umbauen oder explizit sagen

javax.swing.filechooser.FileFilter fc = new javax.swing.filechooser.FilteFilter(){....


Dann weiß er das er diesen nehmen soll


----------



## Guest (1. Jun 2006)

> Also müsstest du die imports umbauen oder explizit sagen
> 
> javax.swing.filechooser.FileFilter fc = new javax.swing.filechooser.FilteFilter(){....
> 
> ...



Ich habe es jetzt so:


```
fc.setFileFilter( new javax.swing.filechooser.FileFilter() { 
          public boolean accept( File f ) { 
            return f.isDirectory() || f.getName().toLowerCase().endsWith(dateityp); 
          } 
          public String getDescription() { 
            return "nur gewähltes Format"; 
          } 
        } );
```

Geht aber dennoch nicht.

Der erste Fehler ist weg, aber der zweite kommt immernoch.

Hier ist nochmal Fehler:


> Auf lokale Variable dateityp wird aus einer verschachtelten Klasse heraus zugegriffen; sie muss als final deklariert sein



Aber final deklarieren kann ich sie nicht, weil ich ja sonst den Dateityp (der zuvor ausgewählt wurde) nicht zuweisen kann.


----------



## L-ectron-X (2. Jun 2006)

Du kannst dennoch darauf zugreifen, auch ohne final.
Dazu schreibst du _Klasse.this.VariableOderMethode_

_Klasse_ bezeichnet die Klasse, welche die innere Klasse umgibt.
_this_ zeigt auf eine Instanz dieser Klasse.
Und _VariableOderMethode_ beschreibt eine Instanzvariable oder Instanzmethode der umgebenden Klasse.


----------

