# Ordner + Unterordner "auslesen" ?



## BleedingSt4r (4. Mai 2010)

Guten Abend!
Ich arbeite gerade an meinem ersten "Projekt". Mein Ziel ist ein kleines Java Programm mit GUI, welches dem Nutzer per JFileChooser (mit JButton verknüpft) ermöglicht, Ordner (mehrere wenn möglich) auszuwählen. Die ausgewählten Ordner werden daraufhin nach Unterordnern überprüft. Haben sie Unterordner, so sollen die Namen dieser an eine in der GUI platzierte JTextArea übergeben werden und dort dann auch angezeigt werden, sodass der Nutzer nun den mehrzeiligen Text (Pro Ordner eine neue Zeile) kopieren und irgendwo einfügen kann.

(Ich kam auf diese Idee, da ich in einem Musikportal meine Lieblingskünstler eintragen wollte, deren CD's ich in mp3 Form auf meinem Rechner habe (Geordnet nach Interpreten). Da es einige sind und ich sie nicht einzeln abtippen wollte, dachte ich man kann das einfach mal programmieren.)

Ich habe auch schon, wie ich finde, eine Menge geschafft, obwohl ich noch nicht lange dabei bin. (Wir lernen Java im Informatikunterricht am Gymnasium, sind naber derzeit mit anderen Dingen beschäftigt, deswegen kann ich schlecht meinen Lehrer im Unterricht fragen). Mein "Programm" kann bereits einzelne Ordner (ohne Unterordner) in die JTextArea einfügen.

Ich brauche nun aber Hilfe, da Google mir leider nur für mich unnützes Zeug ausspuckt. Ich komme einfahc nicht dahinter, wie ich einprogrammiere, dass zunächst einmal Unterordner ausgelesen werden, und dass diese ausgelesenen Unterverzeichnisse dann in der JTextArea eingefügt werden, mit je einer neuen Zeile dahinter. (\n, das weiß ich, aber wie wende ich das in dem Fall an?) Ich weiß keinen Rat mehr.. Ich hoffe ihr könnt mir helfen.

Anbei der Quellcode des Actionlisteners vom JButton, welcher den JFileChooser "aktiviert". So sieht es bisher aus:


```
public void actionPerformed(ActionEvent e) 
  {
	    CH1 = new JFileChooser();                                  // JFileChooser erzeugen.
	    CH1.setCurrentDirectory(new java.io.File("."));            // Verzeichnis festlegen, welches standardmäßig beim ausführen des JFileChoosers angezeigt wird.
	    CH1.setDialogTitle("Verzeichnis auswählen");               // Titel des "Öffnen-Dialogs" festlegen.
	    //CH1.setMultiSelectionEnabled(true);                      // Dem Nutzer erlauben, mehrere Dateien / Verzeichnisse zu wählen.
	    CH1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);   // Es können nur Verzeichnisse gewählt werden.
	    CH1.setFileHidingEnabled(false);                           // Auch versteckte Dateien werden angezeigt.
	    CH1.setAcceptAllFileFilterUsed(false);                     // Keine Dateifilter können festgelegt werden.
	    if (CH1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) 
	      {
              String ChoosedFile = CH1.getSelectedFile().getName();// Name der Datei / des Verzeichnisses als String zwischenspeichern. 
              TA1.setText(ChoosedFile);                            // Zwischengespeicherten String der JTextArea übergeben.
	      }
	    else 
	      {
	      System.out.println("Es wurde keine Verzeichnisauswahl getroffen.");
	      }
  }
```

Hier nochmal ein paar Bilder wie es ausschaut:













Hoffentlich waren das jetzt nicht zu viele Infos und ich bin hier auch im richtigen Unterforum.. Jedenfalls freue ich mich auf eure Antworten und hoffe mir kann jemand helfen.

Liebe Grüße aus NRW,
_BleedingSt4r_


----------



## EdelStoff (4. Mai 2010)

Hi,

willst du nur die Unterordner des Ordners den du auswählst oder auch die Unterordner der Unterordner usw.

mit 
	
	
	
	





```
File file = CH1.getSelectedFile()
```
 bekommst du das File Objekt von dem ausgewählten Ordner. Mit der Methode listFiles() bekommst du dann ein File Array mit allen Dateien und Ordner dieses Ordners.


Wenn du nur die Unterordner des aktuellen Ordners brauchst könntest du soetwas machen.

```
File file = CH1.getSelectedFile();
File[] files = file.listFiles();
for(int i=0; i< files.length; i++) {
       if(files[i].isDirectory()) {
             TA1.append(files[i].getName());
       }
}
```

Für alle Unterordner würd ich dir eine rekursive Methode empfehlen die sich für jeden Ordner selbst aufruft.


----------



## Frank1975 (4. Mai 2010)

Rekursiv siehts dann so in etwa aus:

```
static void baumdurchsuchen(File file) {
 		if (file.isDirectory()) {
 			File[] sBaum= file.listFiles();
 			for (int i = 0; i < sBaum.length; i++) {
 				System.out.println(sBaum[i].getAbsolutePath()); //Dir ausgeben
 				baumdurchsuchen(sBaum[i]);
 			}
 		} else {
 			System.out.println(file.getAbsolutePath()); //File ausgeben
 		}
 	}
```


----------



## BleedingSt4r (5. Mai 2010)

EdelStoff hat gesagt.:


> Hi,
> 
> willst du nur die Unterordner des Ordners den du auswählst oder auch die Unterordner der Unterordner usw.
> 
> ...



Danke! Super, jetzt macht er bei mir alles untereinander.. Schön! Was mir noich fehlt ist aber eine  Scrollbar, da JTextArea das nicht automatisch macht.. Kann mir da jemand behilflich sein ?



Frank1975 hat gesagt.:


> Rekursiv siehts dann so in etwa aus:
> 
> ```
> static void baumdurchsuchen(File file) {
> ...


Danke auch für deine Antwort, jedoch wollte ich das ganze nicht durch System.out.println ausgeben, sondern wie gesagt durch eine JTextArea.


----------



## BumBel (5. Mai 2010)

Dazu musst du erst eine JScrollpane erzeugen.
Dem Frame 
	
	
	
	





```
f.add(scrollpane);
```
das scrollpane adden
und dem scrollpane dann wieder das panel in dem du ausgibst mit dem befehl

```
scrollpane.setViewportView(outputPanel);
```
 als Inhalt setzen


----------



## MarderFahrer (5. Mai 2010)

Ich glaube, was Frank dir zeigen wollte war die Rekursion. Also für den Fall, dass du nicht nur Unterordner hast, sondern diese unterordner ihrerseits auch Unterordner besitzen.

Das mit "System.out" ist auch nur erst mal als eine Art Debug Information anzusehen. Damit man kontrollieren kann ob die Methode auch das richtige ausgibt. Sobald man das festgestellt hat, kann man mit den Strings ja quasi machen, was man möchte. Also anstelle von "System.out.println(String)" macht man dann JTextArea.setText(String).

Zu deiner ersten Frage bzgl. des Scrollens. Das ist relativ einfach. Du musst nichts weiter tun, als ein JScrollPane Object zu erstellen und diesem die JTextArea zu übergeben. Also ungefähr so:


```
JTextArea TA1 = new JTextArea();
TA1.setText("Test");
JScrollPane scrollingArea = new JScrollPane(TA1)
```

Desweiteren solltest du nicht TA1 benutzen für die TextArea. Lieber tA1. Oder besser noch sprechendere Namen. mainTextArea o.Ä aber das ist Geschmackssache. Nur die Konvention das man Variablen mit Kleinbuchstaben anfängt soltle schon eingehalten werden.


----------



## BleedingSt4r (5. Mai 2010)

MarderFahrer hat gesagt.:


> Ich glaube, was Frank dir zeigen wollte war die Rekursion. Also für den Fall, dass du nicht nur Unterordner hast, sondern diese unterordner ihrerseits auch Unterordner besitzen.
> 
> Das mit "System.out" ist auch nur erst mal als eine Art Debug Information anzusehen. Damit man kontrollieren kann ob die Methode auch das richtige ausgibt. Sobald man das festgestellt hat, kann man mit den Strings ja quasi machen, was man möchte. Also anstelle von "System.out.println(String)" macht man dann JTextArea.setText(String).
> 
> ...



Hey! Danke erstmal für die schnelle Antwort. Jedoch funktioniert das so bei mir nicht, die JTextArea erscheint so wie immer, also ohne Scrollbar. Eventuell reicht mein Code Schnipsel nicht, um Hilfe zu bekommen:

*1. Klasse:*

```
public class Fenster extends JPanel implements ActionListener
{
	JButton button1;
	JFileChooser fileChooser1;
	JTextArea textArea1;
	Listener myListener = new Listener();
    int a, b, x, y;
	
  public Fenster()
  {
	  

	  x = 400 - 165;
	  y = 500 - 25;                                                			// Vier Integer Werte erstellen, um zentrierte Position
	  a = x/2;                                                     			// des JButtons zu garantieren.
	  b = y/3;                                                  
  
	  Color mycol = new Color (47, 79, 79);                        			// RGB-Farbe für den GUI Background erstellen.
	  Color mycol2 = new Color (232, 232, 232);				       			// RGB-Farbe für den Button und das TextArea erstellen.
	  
	  button1 = new JButton("Verzeichnis wählen..");                    	// JButton erzeugen.
	  button1.setBounds(a, b, 165, 25);                                 	// Position des JButtons an der GUI festlegen.
	  button1.addActionListener(this);                                  	// Dem JButton einen Action Listener hinzufügen.
	  button1.setBackground(Color.white);                               	// Farbe des Buttons festlegen.
	  
      textArea1 = new JTextArea();                                       	// JTextArea erzeugen.
      JScrollPane scrollingArea = new JScrollPane(textArea1);
      textArea1.setBounds(x/4, 195, 278, 240);                           	// Position der JTextArea an der GUI festlegen.
      textArea1.setBackground(mycol2);                                   	// Hintergrundfarbe der JTextArea festlegen.
      textArea1.setVisible(true);                                        	// Sichtbarkeit der JTextArea aktivieren.
	  
	  this.setLayout(null);                                                 // "Null" Layout für die GUI festlegen, um Elemente manuell zu platzieren.
      this.setBackground(mycol);                                            // Hintergrundfarbe der GUI festlegen.
      this.add(button1);                                                    // Der GUI den zuvor erzeugten JButton anfügen.
      this.add(textArea1);
  }

[...]

 public static void main(String s[]) 
  {
	    JFrame frame = new JFrame("Test");
	    Fenster panel = new Fenster();
	    
	    frame.addWindowListener(
	      new WindowAdapter() 
	      {
	        public void windowClosing(WindowEvent e) 
	        {
	          System.exit(0);
	          }
	        }
	      );
	    frame.getContentPane().add(panel,"Center");
	    frame.setSize(panel.getPreferredSize());
	    frame.setVisible(true);
   }
```

*2. Klasse:* // Mit der Klasse lasse ich die GUI zentriert erscheinen.

```
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;

public class ZentrierFrame extends JFrame
{
	Fenster irgendwas;
	
	public ZentrierFrame()
	{
		super("Folder Output v.0.1");
		irgendwas = new Fenster();
		this.add(irgendwas);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        int c = (int)dim.getWidth() - 400;
        int d = (int)dim.getHeight() - 500;
        int e = c / 2;
        int f = d / 2;
        this.setBounds(e,f,400,500);
        this.setResizable(false);
        this.setVisible(true);
	}
	
	public static void main (String [] args0)
	{
		ZentrierFrame blub = new ZentrierFrame();
	}
}
```

So. Vielleicht ist es so besser.


----------



## MarderFahrer (5. Mai 2010)

In der 1. Klasse Zeile 35:

```
this.add(textArea1);
```

einmal ersetzen durch:

```
this.add(scrollingArea);
```

Du hast dem Panel bisher immer direkt die TextArea zugewiesen. Nun, da du eine Scroll Pane benutzt, der du die TextArea zugewisen hast, arbeitest du ab sofort mit der ScrollPane weiter.
Soll heißen:
ScrollPane beinhaltet die TextArea. Also muss "nur" die ScrollPane dem Panel in Zeile 35 hinzugefügt werden. Darin enthalten ist ja ab sofort die TextArea.

Das sollte eigentlich funktionieren, meiner Meinung nach. Aber ausprobiert hab ich das jetzt nicht.


----------



## BleedingSt4r (5. Mai 2010)

MarderFahrer hat gesagt.:


> In der 1. Klasse Zeile 35:
> 
> ```
> this.add(textArea1);
> ...



Habs probiert, die JTextArea verschwindet dann aber wenn ich die GUI öffne.  
Es ist dann also nur noch der Button zu sehen..


----------



## EdelStoff (5. Mai 2010)

nicht vergessen der scrollingArea eine Größe zu geben.


```
scrollingArea.setSize(100, 100);
```


----------



## BleedingSt4r (5. Mai 2010)

EdelStoff hat gesagt.:


> nicht vergessen der scrollingArea eine Größe zu geben.
> 
> 
> ```
> ...



Ah wundervoll! Danke für den Tip, nachdem ich das noch hinzugefügt hatte, war die JTextArea ganz oben links in der GUI. Das brachte mich auf die Idee, statt setSize() einfach setBounds() zu nehmen und die vorher eingestellten Variablen der TextArea zu verwenden, et voilá, es funktioniert.

Das einzig lästige ist jetzt, dass mein Prog wegen der for Schleife auch nach dem letzten ausgelesenen Unterordner ein \n, also eine neue Zeile anhängt. Was bedeutet, dass ich am Schluss eine Liste mit einer leeren zusätzlichen Zeile habe. Hat jemand eine Idee, wie man das beheben könnte? 

Vielen Dank für die bisherigen Antworten, ihr habt mir sehr sehr sehr geholfen!


----------



## MarderFahrer (6. Mai 2010)

Das könnte jetzt etwas umständlich sein aber das müsste funktionieren:

Du hast solch eine For-Schleife, korrekt?

```
for(int i=0; i< files.length; i++) {

       if(files[i].isDirectory()) {
             TA1.append(files[i].getName());
             TA1.append("\n");
       }
}
```

Du könntest die "\n" in ein extra if Statement packen. Das es nur dann ausgeführt wird, solange es nicht der letzte Durchlauf der For-Schleife ist. Etwa so:

```
for(int i=0; i< files.length; i++) {

       if(files[i].isDirectory()) {
             TA1.append(files[i].getName());
              if(i != files.length-1){
                  TA1.append("\n");
              }
       }

}
```

Ach Mist, ich seh grade, dass das nur dann ordentlich funktioniert, wenn das letzte Element im File Array ein Verzeichnis ist. Wäre es ein Array, in dem das letzte Element eine Datei ist und das vorletzte ein Verzeichnis, dann würde die Schleife nach dem Verzeichnis ein "\n" ausgeben, weil es ja nicht das letzte Element im Array ist. Aber da das letzte Element kein Verzeichnis ist, wird die ganze Files_.isDirectory() Sache übersprungen und die Schleife beendet. Und schon hat man wieder ein "\n" am Ende in der TextArea._


----------



## BleedingSt4r (6. Mai 2010)

MarderFahrer hat gesagt.:


> Das könnte jetzt etwas umständlich sein aber das müsste funktionieren:
> 
> Du hast solch eine For-Schleife, korrekt?
> 
> ...


_

Das Prog soll sowieso keine Dateien ausgeben, sondern nur Verzeichnisse. Dass es aber beides ausgibt habe ich vorhin auch gemerkt.. Oh man. Probleme über Probleme.^^

Meine for-Schleife sieht folgendermaßen aus:


		Java:In die Zwischenablage kopieren


if (fileChooser1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) 
	      {
	    	File file = fileChooser1.getSelectedFile();
	    	File[] files = file.listFiles();
	    	for(int i=0; i< files.length; i++)
	    	{
	    	   textArea1.append(files[i].getName() + '\n');
	    	}  
	      }
	    else 
	      {
	      System.out.println("Es wurde keine Verzeichnisauswahl getroffen.");
	      }

_


----------



## MarderFahrer (7. Mai 2010)

Ok, in deiner For-Schleife fehlt eine überprüfung ob es sich um eine Datei oder ein Verzeichnis handelt.
Wenn du es so machen würdest:

```
File file = fileChooser1.getSelectedFile();
            File[] files = file.listFiles();
            for(int i=0; i< files.length; i++)
            {
               if(files[i].isDirectory()) 
               {
                  textArea1.append(files[i].getName() + '\n');
               }
            }
```

Dann würde deiner Text Area nur die Elemente auf deinem "files" Array angehängt, welche Verzeichnisse sind. Bei Dateien würde in Zeile 5 ein False passieren und es würde nichts an die Text Area angehängt. Damit hättest du schon mal eine Reine Liste von Verzeichnissen ohne Dateien. Aber das Problem mit der letzten "\n" am Ende besteht weiterhin.


----------



## BleedingSt4r (9. Mai 2010)

MarderFahrer hat gesagt.:


> Ok, in deiner For-Schleife fehlt eine überprüfung ob es sich um eine Datei oder ein Verzeichnis handelt.
> Wenn du es so machen würdest:
> 
> ```
> ...



Super vielen Dank. 
Hm.. Gibt es nicht evtl. irgendeinen Befehl um die letzte Zeile einer JTextArea zu löschen?


----------



## MarderFahrer (9. Mai 2010)

Einen schönen Sonntag 
Wie wäre es hier mit?:

```
File file = fileChooser1.getSelectedFile();
File[] files = file.listFiles();

for(int i=0; i< files.length; i++){

    if(files[i].isDirectory()) {
        if (textArea1.length() > 0){
            textArea1.append("\n");
        }
        textArea1.append(files[i].getName());
    }

}
```

Nehmen wir folgenden Inhalt für das File Array an:
0. DateiName1
1. VerzeichnisName1
2. VerzeichnisName2
3. DateiName2
4. VerzeichnisName3

Zuerst werden alle Einträge "DateiNameX" übersprungen und es wird damit nichts weiter gemacht.(So weit waren wir ja bereits schon) Beim Inhalt "VerzeichnisNameX" wird jetzt weiter geprüft, ob in der TextArea schon etwas drin steht. Nur wenn schon etwas drin steht wird ein Zeilenumbruch eingefügt.
Das bedeutet, das beim ersten Element kein Zeilenumbruch eingefügt wird, sondern nur der Text. Was ja Sinnvoll ist. Weiterhin wird dadurch bei jedem Durchlauf der Schleife erst ein Zeilenumbruch und DANACH erst der eigentliche Inhalt eingefügt. Das hätte zur Folge, das beim letzten Eintrag ebenfalls erst der Zeilenumbruch und danach erst der Inhalt eingefügt wird. Ergibt: Keinen überflüssigen Zeilenumbruch am Ende.


----------



## BleedingSt4r (10. Mai 2010)

MarderFahrer hat gesagt.:


> Einen schönen Sonntag
> Wie wäre es hier mit?:
> 
> ```
> ...


Hi, danke erstmal. Ich muss jedoch ehrlich sagen, dass ichs nicht verstanden hab.. Könntest dus mir nochmal erklären ?


----------



## MarderFahrer (11. Mai 2010)

Ok, vorher wurde immer erst der Text in die TextArea geschrieben und danach ein "\n" angehängt.
Nun wird zuerst das "\n" geschrieben und danach der Text angehängt. Auf diese Weise kommt zum Schluss kein weiteres "\n" zu stande.

Natürlich hätte man auch diese Weise dann das umgekehrte Problem. Nämlich, dass man am Anfang mit einem "\n" in der TextArea beginnt. Dies umgeht man, in dem man das Schreiben von "\n" in eine if-Abfrage packt, die testet ob in der TextArea schon etwas steht. Das ist beim ersten Mal eben nicht der Fall, also wird "\n" nicht geschrieben sondern nur der Text. Beim nächsten Durchlauf steht dann etwas in der TextArea, also wird das "\n" und der Text geschrieben usw.


----------



## Java-Freak (11. Mai 2010)

kannst du bitte mal dein ganzes prog posten?
ich würds mir gern mal anschauen was draus geworden is


----------



## BleedingSt4r (11. Mai 2010)

MarderFahrer hat gesagt.:


> Ok, vorher wurde immer erst der Text in die TextArea geschrieben und danach ein "\n" angehängt.
> Nun wird zuerst das "\n" geschrieben und danach der Text angehängt. Auf diese Weise kommt zum Schluss kein weiteres "\n" zu stande.
> 
> Natürlich hätte man auch diese Weise dann das umgekehrte Problem. Nämlich, dass man am Anfang mit einem "\n" in der TextArea beginnt. Dies umgeht man, in dem man das Schreiben von "\n" in eine if-Abfrage packt, die testet ob in der TextArea schon etwas steht. Das ist beim ersten Mal eben nicht der Fall, also wird "\n" nicht geschrieben sondern nur der Text. Beim nächsten Durchlauf steht dann etwas in der TextArea, also wird das "\n" und der Text geschrieben usw.



Aaaaaah. Jetzt ist der Groschen gefallen. Habs versucht und schon taucht das nächste Problem auf:


```
File file = fileChooser1.getSelectedFile();
	    	File[] files = file.listFiles();
	    	for(int i=0; i< files.length; i++)
	    	{
	    	   if(files[i].isDirectory())
	    	   {
	    		   if(textArea1.getText() != "")
	    		   {
	    			   textArea1.append("\n");
	    		   }
	    		   textArea1.append(files[i].getName());
	    	   }
	    	}
```
<--- Weil ich bei textArea1.length einen Fehler bekomme ("The method length() is undefined for the type JTextArea") habe ichs quasi umgeschrieben in: *textArea1.getText() != ""*. Wenn der Inhalt ungleich 'Leer' ist, also einen Inhalt hat, wird ein Zeilenumbruch ausgeführt. Das Ergebnis ist, dass ich am Ende der JTextArea keine weitere Zeile habe, dafür aber am Anfang. Trotz der if-Bedingung. Seltsam..


----------



## MarderFahrer (12. Mai 2010)

Hoppla, das passiert wenn man versucht einfach alles im Kopf zu programmieren ohne Eclipse zu benutzen. 
Probiere es mal mit folgender Änderung:

*Von:*

```
if (textArea1.length() > 0)
```

*Nach:*

```
if (textArea1.getText().length() > 0)
```

Die TextArea an sich hat natürlich keine Länge. Ihr Text Inhalt allerdings schon. Also erst einmal den Text holen und dadrauf dann die Länge abfragen. So sollte es funktionieren. Diese if-Abfrage liefert nur 0 zurück wenn in der TextArea gar nichts bzw. nur ein leerer String ("") stehen würde. Ansonsten gibt es die Buchstabenanzahl des gesamten JTextArea Inhaltes wieder.


----------



## BleedingSt4r (12. Mai 2010)

Java-Freak hat gesagt.:


> kannst du bitte mal dein ganzes prog posten?
> ich würds mir gern mal anschauen was draus geworden is



Ich poste es evtl. wenn ich fertig bin, momentan ist aber noch sowohl Erweiterung als auch Fein-Tuning der Basisfunktionen an der Reihe. (Außerdem hab ich ehrlich gesagt keine Ahnung wie man das Projekt in eine  .jar kompiliert.. ;D (Java Programme werden doch in .jar kompiliert, oder irre ich mich?)



MarderFahrer hat gesagt.:


> Hoppla, das passiert wenn man versucht einfach alles im Kopf zu programmieren ohne Eclipse zu benutzen.
> Probiere es mal mit folgender Änderung:
> 
> *Von:*
> ...



Suuuuuper, dankesehr! (Zum hundertsten Male ) Jetzt funktioniert es!

Habe jetzt nur noch ein Problem mit der Menubar die nicht erscheinen möchte.. Leider muss ich jetzt fort D), ich werde den Code nachher reineditieren.

_Edit:_ Habs grade selbst hinbekommen, ich musste frame.setVisible(true); ganz am Ende hinzufügen, damit meine JMenuBar erscheint. 

Nochmal zu dem Thema Programm 'zeigen'. Kann man hier im Forum irgendwo nen Thread für sein eigenes Projekt eröffnen und da dann immer den State of Progress reineditieren und seine Projekte dann halt auch zeigen, oder sowas? Dann würde ich das evtl. machen, falls das überhaupt jemanden interessiert. Also sone Art Projekt Showroom für Feedback und all sowas..


----------



## Java-Freak (12. Mai 2010)

vll da wo "Ihr möchtet eure Projekte vorstellen?" steht? 
Codeschnipsel u. Projekte - java-forum.org


----------



## BleedingSt4r (13. Mai 2010)

Java-Freak hat gesagt.:


> vll da wo "Ihr möchtet eure Projekte vorstellen?" steht?
> Codeschnipsel u. Projekte - java-forum.org



Alles klar, danke ;D Thread ist hier.


So und weiter im Text: Habe wieder ne Frage: Wenn ich den Inhalt der JTextArea als .txt speichern will (was an für sich kein Problem ist) gibt es zwei Dinge, die mir nicht gefallen:

1.) Immer wenn man in den vorigen Ordner zurückkehrt, im FileChooser also auf Zurück klickt, steht im 'Dateiname'-Feld der komplette Pfad vom gerade selektierten Ordner:





Da das sehr unschön ist wie ich finde würde ich das gern beheben..

2.) Wenn man die Datei dann speichern will, muss man den Dateinamen und zusätzlich die Dateiendung, also .txt eintippen (z.B. MeineTextDatei.txt).. Kann man irgendwie einstellen, dass die Endung beim speichern immer .txt ist, ob man sie nun beim Speichern hinschreibt oder nicht?


----------



## Java-Freak (13. Mai 2010)

zu 1) JFileChooser haben das nun mal an sich, so unschön find ichs gar nicht und wüsste grad au net wie mans ändern könnte 
Zu 2)Da müsstest du glaub ich einen filter verwenden.


----------



## agentone (14. Mai 2010)

Moin!

1.) Was soll daran so schlimm sein??
2.) Du prüfst einfach, ob eine Endung eingegeben wurde mit endsWith(".txt"), und wenn nicht, fügst das Programm halt eine an.


----------



## BleedingSt4r (16. Mai 2010)

Java-Freak hat gesagt.:


> zu 1) JFileChooser haben das nun mal an sich, so unschön find ichs gar nicht und wüsste grad au net wie mans ändern könnte
> Zu 2)Da müsstest du glaub ich einen filter verwenden.


1.) Na gut! ;D
2.) Filter hab ich schon probiert, bleibt auch drin. Ändert aber nichts an der Endung der Datei, die man speichert. 


agentone hat gesagt.:


> Moin!
> 
> 1.) Was soll daran so schlimm sein??
> 2.) Du prüfst einfach, ob eine Endung eingegeben wurde mit endsWith(".txt"), und wenn nicht, fügst das Programm halt eine an.


1.) Hum.. Weiß nicht, finds einfach schöner ohne. 
2.) Werds mal probieren, danke.


----------



## BleedingSt4r (16. Mai 2010)

agentone hat gesagt.:


> 2.) Du prüfst einfach, ob eine Endung eingegeben wurde mit endsWith(".txt"), und wenn nicht, fügst das Programm halt eine an.



Soo. Hab jetzt nochmal in meinen Quelltext geschaut. Die if-Bedingung muss ja dann dort rein:

```
if(e.getSource()==button3)
	  {
		  if(textArea1.getText().length() > 0)
		  {
			 FileNameExtensionFilter txtFilter = new FileNameExtensionFilter("Textdateien","txt");
			 fileChooser1.setAcceptAllFileFilterUsed(false);   
			 fileChooser1.addChoosableFileFilter(txtFilter);
			  
			 int val = fileChooser1.showSaveDialog(null);
		     if (val == JFileChooser.APPROVE_OPTION)
		     {
		       String content = textArea1.getText();
		       try 
		       {
			     BufferedWriter out = new BufferedWriter(new FileWriter(fileChooser1.getSelectedFile()));
		         out.write(content);
			     out.close();
			     JOptionPane.showMessageDialog(this, "Es wird empfohlen, die .txt Datei nicht mit dem Windows Editor" + "\n" + "zu öffnen, da es zu Problemen mit dem Zeilenumbruch kommen kann." + "\n" + "Nutzen Sie Wordpad, Notepad++, oder ähnliche Freeware."); 		         
		       } 
		         catch (IOException f) 
		         {
		         System.out.println("Die Datei konnte nicht gespeichert werden.");
		         }
		     }
		  }
		  else
		  {
			  JOptionPane.showMessageDialog(this, "Der Inhalt ist leer, bitte wählen Sie ein Verzeichnis, um" + "\n" + "die Unterordner in einer .txt Datei zu speichern!");
		  }
	  }
```
Nur weiß ich jetzt erstmal nicht, wo das endsWith(".txt") hingehört (content.endsWith() macht ja kaum Sinn, oder?) und dann, wie ich .txt ans Ende des Dateinamens anfüge für einen elxe case?


----------



## Java-Freak (16. Mai 2010)

Versuchs mal so: 

```
if(textArea1.getText().length() > 0)
            {
               FileNameExtensionFilter txtFilter = new FileNameExtensionFilter("Textdateien","txt");
                fileChooser1.addChoosableFileFilter(txtFilter);
               
               
                
               int val = fileChooser1.showSaveDialog(null);
               if (val == JFileChooser.APPROVE_OPTION)
               {
                File file = fileChooser1.getSelectedFile();
				if (!file.getName().endsWith("." + "prog")) {
				file = new File(fileChooser1.getSelectedFile() + "." + "DateiEndung");
				}
                 try 
                 {
                   FileWriter fw = new FileWriter(file);
                   fw.write(textArea1.getText());
                   fw.close();         
                 } 
                   catch (IOException f) 
                   {
                   System.out.println("Die Datei konnte nicht gespeichert werden.");
                   }
               }
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Der Inhalt ist leer, bitte wählen Sie ein Verzeichnis, um" + "\n" + "die Unterordner in einer .txt Datei zu speichern!");
            }
```


----------



## BleedingSt4r (16. Mai 2010)

JavaFreak: Vielen lieben Dank, hat suuuuper funktioniert.


----------



## Java-Freak (17. Mai 2010)

keine ursache


----------



## BleedingSt4r (20. Mai 2010)

Hallo Freunde der Java-Programmierung.
Habe wieder mal ne Frage.. Und zwar komme ich einfach nicht dahinter, wie man durch einen Klick auf einen Button oder durch nen Eintrag ein neues "Fenster" öffnet. Ich wollte ein "About.." Fenster erstellen, welches sich öffnet wenn ich in meiner JMenuBar auf "Informationen" klicke und dann in dem ausfahrenden Menü auf "Über.." klicke. Dann soll sich halt ein neues Fenster öffnen (Macht man das am Besten mit nem Frame oder nem Panel?) In diesem Fenster soll dann was stehen (Infos eben.) und unten soll ein 'OK' Button sein, mit dem ich das Fenster wieder schließen und zur GUI zurückkehren kann .. Habe JFrame und JLabel seperat ausprobiert, aber mein Programm stürzt ab wenn ich den Button der das Fenster öffnen soll anklicke.. (Bzw. die Debug Perspektive öffnet sich)

Zur Erinnerung nochmal mein Quelltext (Meine Versuche sind in folgenden Zeilen zu finden: Z.45-47; 61-63; 70; 152-155):
*1. Klasse:*

```
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.Runtime;
import java.util.*;
import java.awt.BorderLayout;
import java.awt.Container;

public class Fenster extends JPanel implements ActionListener
{
	JButton button1, button2, button3, button4;
	JFileChooser fileChooser1;
	JTextArea textArea1;
	JFrame aboutWindow;
	Listener myListener = new Listener();
    int a, b, x, y;
	
  public Fenster()
  {
	  x = 400 - 165;
	  y = 500 - 25;                                                			// Vier Integer Werte erstellen, um zentrierte Position
	  a = x/2;                                                     			// des JButtons zu garantieren.
	  b = y/3;                                                  
  
	  Color mycol = new Color (205, 0, 0);                        			// RGB-Farbe für den GUI Background erstellen.
	  Color mycol2 = new Color (165, 042, 042);				       			// RGB-Farbe für den Button und das TextArea erstellen.
	  
	  button1 = new JButton("Verzeichnis wählen..");                    	// JButton erzeugen.
	  button1.setBounds(a, 102, 165, 25);                                 	// Position des JButtons an der GUI festlegen.
	  button1.addActionListener(this);                                  	// Dem JButton einen Action Listener hinzufügen.
	  
	  button2 = new JButton("Liste leeren");
	  button2.setBounds(a, 130, 165, 25);
	  button2.addActionListener(this);
	  
	  button3 = new JButton("In .txt speichern");
	  button3.setBounds(a, b, 165, 25);
	  button3.addActionListener(this);
	  
	  button4 = new JButton("Label öffnen");
	  button4.setBounds(a, b, 165, 25);
	  button4.addActionListener(this);
	  
      textArea1 = new JTextArea();                                       	// JTextArea erzeugen.
      textArea1.setBounds(x/4, 195, 278, 240);                           	// Position der JTextArea an der GUI festlegen.
      textArea1.setEditable(false);
      textArea1.setVisible(true);                                        	// Sichtbarkeit der JTextArea aktivieren.
      
      JScrollPane scrollingArea = new JScrollPane(textArea1);
      scrollingArea.setBounds(x/4, 195, 278, 240);
      
      ImageIcon bild = new ImageIcon("EGAL!");
      JLabel bildLabel = new JLabel(bild);
      bildLabel.setBounds(55, 10, 280, 80);
      
      JFrame aboutWindow = new JFrame();                             // oder JLabel aboutWindow = new JLabel();
      aboutWindow.setBounds(0, 0, 500, 500);
      aboutWindow.setVisible(false);
      
	  this.setLayout(null);                                                 // "Null" Layout für die GUI festlegen, um Elemente manuell zu platzieren.
      this.setBackground(mycol2);                                            // Hintergrundfarbe der GUI festlegen.
      this.add(button1);                                                    // Der GUI den zuvor erzeugten JButton anfügen.
      this.add(button2);
      //this.add(button3);
      this.add(button4);
      this.add(scrollingArea);                                              // Der GUI die zuvor erzeugte ScrollingArea hinzufügen.
      this.add(bildLabel);
  }
  
  public Dimension getPreferredSize()
  {
	  return new Dimension(400, 500);                                       // Die Größe der GUI festlegen.
  }
  
  public void actionPerformed(ActionEvent e) 
  {
	  if(e.getSource()==button1)
	  {
	    fileChooser1 = new JFileChooser();                                  // JFileChooser erzeugen.
	    fileChooser1.setCurrentDirectory(null);                             // Verzeichnis festlegen, welches standardmäßig beim ausführen des JFileChoosers angezeigt wird.
	    fileChooser1.setDialogTitle("Verzeichnis auswählen");               // Titel des "Öffnen-Dialogs" festlegen.
	    fileChooser1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);   // Es können nur Verzeichnisse gewählt werden.
	    fileChooser1.setFileHidingEnabled(false);                           // Auch versteckte Dateien werden angezeigt.
	    fileChooser1.setAcceptAllFileFilterUsed(false);                     // Keine Dateifilter können festgelegt werden.
	    if (fileChooser1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) 
	      {
	    	textArea1.setText("");
	    	File file = fileChooser1.getSelectedFile();
	    	File[] files = file.listFiles();
	    	for(int i=0; i< files.length; i++)
	    	{
	    	   if(files[i].isDirectory())
	    	   {
	    		   if(textArea1.getText().length() > 0)
	    		   {
	    			   textArea1.append("\n");
	    		   }
	    		   textArea1.append(files[i].getName());
	    	   }
	    	}  
	      }
	    else 
	      {
	    	JOptionPane.showMessageDialog(this, "Es wurde kein Verzeichnis ausgewählt!" + "\n" + "Bitte wählen Sie ein Verzeichnis!", "Input Error", JOptionPane.ERROR_MESSAGE);
	      }
	  }
	  
	  if(e.getSource()==button2)
	  {
		  textArea1.setText("");
	  }
	  
	  if(e.getSource()==button3)
	  {
		  if(textArea1.getText().length() > 0)
          {
             FileNameExtensionFilter txtFilter = new FileNameExtensionFilter("Textdateien","txt");
              fileChooser1.addChoosableFileFilter(txtFilter);
             
             
              
             int val = fileChooser1.showSaveDialog(null);
             if (val == JFileChooser.APPROVE_OPTION)
             {
              File file = fileChooser1.getSelectedFile();
              if (!file.getName().endsWith("." + "txt")) {
              file = new File(fileChooser1.getSelectedFile() + "." + "txt");
              }
               try 
               {
                 FileWriter fw = new FileWriter(file);
                 fw.write(textArea1.getText());
                 fw.close();         
               } 
                 catch (IOException f) 
                 {
                 System.out.println("Die Datei konnte nicht gespeichert werden.");
                 }
             }
          }
          else
          {
              JOptionPane.showMessageDialog(null, "Der Inhalt ist leer, bitte wählen Sie ein Verzeichnis, um" + "\n" + "die Unterordner in einer .txt Datei zu speichern!");
          }
	  }
	  
	  if(e.getSource()==button4)
	  {
		  aboutWindow.setVisible(true);
	  }
  } 
  
  public static void main(String s[]) 
  {
	    JFrame frame = new JFrame("Folder Output v.0.1 Alpha");
	    Fenster panel = new Fenster();	    
	    frame.addWindowListener(
	      new WindowAdapter() 
	      {
	        public void windowClosing(WindowEvent e) 
	        {
	          System.exit(0);
	          }
	        }
	      );
	    frame.getContentPane().add(panel,"Center");
	    frame.setSize(panel.getPreferredSize());
	    frame.setVisible(true);
  }
}
```

*2. Klasse* _// Diese lässt mein Programm zentriert starten._

```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ZentrierFrame extends JFrame
{
	Fenster irgendwas;
	
	public ZentrierFrame()
	{
		super("Folder Output v.0.1 Alpha");
		irgendwas = new Fenster();
		this.add(irgendwas);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        int c = (int)dim.getWidth() - 400;
        int d = (int)dim.getHeight() - 500;
        int e = c / 2;
        int f = d / 2;
        this.setBounds(e,f,400,500);
        this.setResizable(false);
        
      //------------------------------------//
      //---------JMenuBar hinzufügen--------//
      //------------------------------------//

        JMenuBar menubar = new JMenuBar();
	    this.setJMenuBar(menubar);
	    menubar.setVisible(true);
	    
	    JMenu actions = new JMenu("Aktionen");
	    menubar.add(actions);
	    JMenuItem exit = new JMenuItem("Programm beenden");
	    actions.add(exit);
	    
	    JMenu help = new JMenu("Informationen");
	    menubar.add(help);
	    JMenuItem about = new JMenuItem("Über..");
	    help.add(about);
	    
	    class exitAction implements ActionListener
	    {
	    	public void actionPerformed(ActionEvent g)
	    	{
	    		System.exit(0);
	    	}
	    }
	    exit.addActionListener(new exitAction());
	   //------------------------------------//
	   //---------JMenuBar Fertig!-----------//
	   //------------------------------------//
	    
	    this.setVisible(true);
	}
	
	public static void main (String [] args0)
	{
		ZentrierFrame blub = new ZentrierFrame();
	}
}
```

*3. Klasse* _// Diese ist wohl irrelevant, aber der Vollständigkeit halber pack ichs mal dazu. _

```
import java.awt.event.*;

public class Listener extends WindowAdapter
{
 public void windowClosing(WindowEvent e)
 {
	 System.exit(0);
 }
}
```


----------



## Java-Freak (21. Mai 2010)

```
JOptionPane.showMessageDialog(null,"<-dies ist hans\nhans ist lila...","Hallo",JOptionPane.INFORMATION_MESSAGE);
```
noch nen tipp: gib deinen buttons oder was auch immer sinnvolle namen, und nenn sie nicht button1 oder so.
wenn du nämlich mal ein größeres programm schreibst mit vll 50 buttons kommst du hoffnungslos durcheinander


----------

