# Dateien aus Ordner in einer JList Ausgeben



## MiMa (6. Mai 2012)

Hallo,

ich versuche nun 7 Dateien, die sich in einem Ordner befinden in einem GUI Fenster mit einem JList aus zu geben.

Anfangs hatte ich eine JTextArea genommen und gewundert, das nur die letzte Datei ausgegeben wurde. Dann ist mir aufgefallen, das es sich ja um eine Liste von Dateien handelt und bin dann auch JList gekommen.

Mein code sieht wie folgt aus.


```
// Erstellt das Label für die Dateiliste
        JLabel laDateiListe = new JLabel("Dateien im Ordner");
        // Fügt die Textfelder zum Panel Dateiliste hinzu
        panelDateiListe.add(laDateiListe);
        
        // Erstellt ein Pfadobjekt
        File filePfad = new File("/Users/mi/Postfach");
        // Erstellt ein Array mit der Größe wie die Anzhl der Dateien
        // File[] dateien = filePfad.listFiles();
        File[] dateien = filePfad.listFiles();

        // Alle Dateien werden auf die Konsole und das GUI ausgegeben
        for (int fileAnzahl = 0; fileAnzahl < dateien.length; fileAnzahl++) 
        {
            System.out.println(dateien[fileAnzahl].toString());
            JList liDateiListe = new JList(dateien);
            panelDateiListe.add(liDateiListe);
        }
```

zusätzlich lasse ich mir aber noch die Werte auf der Konsole ausgegeben um zu sehen, ob die Schleife ordnungsgemäß funktioniert.

Das Problem an meinem Code ist, das ich die Dateiliste mehrmals ausgegeben bekomme.
Ist mir auch klar, weil ich das Array "dateien" angegeben habe.

```
JList liDateiListe = new JList(dateien);
```

Andererseits ist ja beim Schleifendurchlauf das Array ja nicht komplett ??
Aber der Compiler meckert wenn ich versuche mit


```
JList liDateiListe = new JList(dateien[fileAnzahl].toString());
```

auf die GUI aus zu geben.

Kann mir jemand helfen?

Danke
Mi


----------



## Gast2 (6. Mai 2012)

Die Schleife brauchst du nicht. Du kannst das Array dateien einfach an den Konstruktor der JList übergeben und die dann anzeigen.


----------



## MiMa (6. Mai 2012)

Vielen Dank,

hat funktioniert

Mi


----------



## MiMa (6. Mai 2012)

Ich würde gerne nur die Dateien anzeigen lassen wollen.
Also den Inhalt von >filePath< ist zuviel.

Gibt es da eine Option womit man das schnell und unkompliziert machen kann, oder muss ich das über eine Methode machen, wobei ich dann den Vorderteil abschneiden muss.

Danke

Mi


----------



## XHelp (6. Mai 2012)

Da musst du einfach einen CellRenderer schreiben. In einem anderen Thread habe ich sowas ähnliches mal angedeutet:
http://www.java-forum.org/java-basi...elklick-datei-oeffnen-z-b-pdf.html#post771003


----------



## MiMa (6. Mai 2012)

Vielen Dank,

Mi


----------



## MiMa (7. Mai 2012)

Also der CellRenderer ist ausführbar, aber ich habe dazu noch ein paar Fragen.

Ich habe mal angefangen den Code zu Kommentieren um die Vorgehensweise zu verstehen.


```
// Methode für das erzeugen Dateiliste
    private DefaultListModel generateDemoModel() {
        // Erzeugt ein Modellobjekt in dem die Dateiliste entsteht
        DefaultListModel model = new DefaultListModel();
        // Erzeugt ein Objekt aus dem Basisverzeichnis "user.home"
        File f = new File(System.getProperty("user.home"));
        // Erstellt ein Array "list" mit der göße = Anzahl der Dateien
        // und die Dateinamen an den Pfad ??
        File[] list = f.listFiles();
                
        // die Schleife baut ein Model Datei für Datei ??
        for (File currentFile : list) {
            // Hängt immer eine Datei an das model an
            model.addElement(currentFile);
            // Ausgabe der Inhalte auf die Konsole
            System.out.println(currentFile);
        }
        
        // Gibt das model zurück, was ist mit dem Array ??
        return model;
    }

    // Startpunkt der Klasse SimpleFileList Renderer
    public static void main(String[] args) {

        /* Konstruktor des Fensters */
        // Erzeugt ein Fenster mit den Namen FileList Demo
        JFrame frame = new JFrame("FileList Demo");
        // Größe des Fensters auf 300 x 500 Pixel
        frame.setSize(300, 500);
        // Fenster Schliessen und Programm beenden mit roten Button
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Fügt einen Scrollbalken hinzu bei mehr Dokumenten
        frame.add(new JScrollPane(new SimpleFileList()));
        // Macht das Fenster sichtbar
        frame.setVisible(true);
    }
```

In der Methode wo das DefaultListModel erstellt wird, habe ich zwar ein Gefühl was es machen soll, aber definitiv nicht genau.


```
File f = new File(System.getProperty("user.home"));
```

Es wird ein Array erstellt mit dem Namen "list" der die komplette Dateiliste enthält?

```
File[] list = f.listFiles();
```

Ich bin JAVA Einsteiger und weiss noch nicht so richtig bescheid, aber ein Array wird erzeugt und dann ein Model mit dem Inhalt eines Arrays, das Datei für Datei aufgebaut wird!

Oder verwechsle ich da was.

Das Array "list" taucht im CellRenderer wieder auf, ok. 
Manchmal verwechsle ich die Lebensdauer der Variablen, also dann sieht es so aus, das list in der klasse lebt und wird im CellRenderer wieder darauf zugegriffen.

Über Kommentare freue ich mich.

Dank

Mi


----------



## MiMa (9. Mai 2012)

Ja vielen Dank, ich habe jetzt eine GUI mit dem GUI Designer von Netbeans gemacht. 
Dort ist der CellRenderer drin, dann komme ich jetzt zumindest weiter im Design.

Mi


----------



## MiMa (10. Mai 2012)

Hallo,

naja wirklich weiter komme ich bisweilen doch nicht.
Ich habe zwar die Felder nun eingebunden bekommen, liefern auch Daten und jetzt passt sich auch das Design bei Vergösserungen an, aber die Liste habe ich bisher noch nicht implementiert bekommen.

Der Generierte Codeabschnitt für die Liste ist wie folgt:


```
liDateiListe = new javax.swing.JList();

liDateiListe.setModel(new javax.swing.AbstractListModel() {
    String[] strings = { "Datei1", "Datei2", "Datei3", "Datei4", "Datei5" };
    public int getSize() { return strings.length; }
    public Object getElementAt(int i) { return strings[i]; }
 });

liDateiListe.setPreferredSize(new java.awt.Dimension(100, 0));

paDateiListe.setViewportView(liDateiListe);
```

Was mir auffällt, ist, das ein Array vom Typ String erstellt wird.

Aus meinem Code habe ich das Array vom Typ File.

Jetzt hänge ich ein bisschen, und überlege, welches wohl der beste Weg wäre
die Dateiliste zu implementieren.

Mein Code war:


```
// Erstellt ein Pfadobjekt
File filePfad = new File("/Users/michael/Aperture Exporte");

// Erstellt ein Array mit der Größe wie die Anzhl der Dateien
File[] dateien = filePfad.listFiles();

// Gibt das Array in einer Liste auf dem GUI aus
JList liDateiListe = new JList(dateien);
```

Über Hilde wäre ich sehr dankbar

Mi


----------



## XHelp (10. Mai 2012)

Was ist denn dein Problem bzw. die Frage?


----------



## MiMa (10. Mai 2012)

Ich weiss nicht genau wie ich das Files Array in den automatisch generierten Code hinein bekomme?
also im Generierten Code wird das Array definiert anhand der geschweiften klammern.
Ich benötige aber ein Array, welches aus Anzahl der Dateien besteht, die in einem Ordner sind.

Mi


----------



## XHelp (11. Mai 2012)

Du hast doch den Code selber schon geschrieben. Musst halt dein File-Array aus dem zweiten Codeschnipsel in den ersten packen.


----------



## MiMa (11. Mai 2012)

Habe den code mehrmals geändert und das ist der aktuelle stand und es gibt immer noch Fehler.
Ich tippe mal das es Probleme mit dem Datentyp hat?
strings erwartet vielleicht einen String zurück und meiner ist vom Typ Files.
Könnte sein das es so ist ?


```
liDateiListe = new javax.swing.JList();

liDateiListe.setModel(new javax.swing.AbstractListModel() {
    // String[] strings = { "Datei.pdf", "Datei.doc", "Datei.numbers", "Datei.pages", "Datei.key" };
    // public int getSize() { return strings.length; }
    // public Object getElementAt(int i) { return strings[i]; }
    /* Erstellt ein Pfadobjekt */
    File filePfad = new File("/Users/michael/Aperture Exporte");
    /* Erstellt ein Array mit der Größe wie die Anzhl der Dateien */
    File[] strings = filePfad.listFiles();
    public int getSize() { return strings.length; }
    public Object getElementAt(int i) { return strings[i]; }

});

liDateiListe.setPreferredSize(new java.awt.Dimension(100, 0));

paDateiListe.setViewportView(liDateiListe);
```

Mi


----------



## vanny (11. Mai 2012)

wenn es einen Fehler gibt, dann poste Ihn auch bitte, das kann beim Helfen helfen 

Gruß Vanny


----------



## MiMa (11. Mai 2012)

Die Meldung ist wie folgt:


```
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
  symbol: class File
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
	at java.awt.EventQueue.access$000(EventQueue.java:102)
	at java.awt.EventQueue$3.run(EventQueue.java:662)
	at java.awt.EventQueue$3.run(EventQueue.java:660)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
```


----------



## vanny (11. Mai 2012)

[DUKE]cannot find symbol
  symbol: class File[/DUKE]

sollte doch schonmal ein Anhaltspunkt sein o0.
Importiere mal File


----------



## MiMa (12. Mai 2012)

Vielen Dank, 

jetzt geht es und die Files werden nun angezeigt, leider sieht das Ergebnis wie in meinem anderen programmierten Code aus.

Und so sieht das Ergebnis aus:


```
/Users/michael/Aperture Exporte/.DS_Store
/Users/michael/Aperture Exporte/2011-12-12.jpg
/Users/michael/Aperture Exporte/2011-12-14.jpg
...
...
```

Ales Ergebnis hätte ich gerne:


```
2011-12-12.jpg
2011-12-14.jpg
...
...
```

Mi


----------



## vanny (12. Mai 2012)

schreib dir ne Methode, die den String beim pathSeperator splittet und gib dir den letzten Teil dann aus.

Gruß Vanny


----------



## XHelp (12. Mai 2012)

vanny hat gesagt.:


> schreib dir ne Methode, die den String beim pathSeperator splittet und gib dir den letzten Teil dann aus.


Wozu? Dafür gibt es [JAPI]File#getName()[/JAPI].


----------



## vanny (12. Mai 2012)

XHelp hat gesagt.:


> Wozu? Dafür gibt es [JAPI]File#getName()[/JAPI].



damit er es selbst gemacht hat 
Entweder ich schau in die API und sehe ok getName(); liefert mir den String hinter dem letzten PathSeperator oder ich muss eben dieses irgendwie selbst erledigen.


Gruß Vanny


----------



## MiMa (12. Mai 2012)

Also das mit getName hört sich gut an.

habe es jetzt oft genug probiert, aber leider scheine ich das nicht ganz richtig zu machen.


```
public Object getElementAt(int i) {return strings[i].getName(); }
```

Da nur in dieser Zeile auf die entsprechende Datei verwiesen wird, muss das hier implementiert werden. Oder mit einer eigenen Methode, die dann in etwas so aussehen muss?


```
public Object getElementAt(int i) {return stringsDateiNamen(strings[i]); }
```
mi


----------



## vanny (12. Mai 2012)

Ich hätte fast losgemeckert, dass man nicht die getName() von Strings aufrufen soll sindern von File:autsch:

*[STRIKE]File[] strings[/STRIKE]*

das verwirrt sowas von 

*File[] allFiles* wäre dort doch deutlicher 

warum schreibst du dir ne getMethode, die ein Object als returnWert hat?

```
public String getFileNameAt(int i) {return allFiles[i].getName(); }
```
sieht imho besser aus

Gruß Vanny


----------



## XHelp (12. Mai 2012)

vanny, getElementAt ist eine typische Methode eines Models...

@TO, du machst da irgendwas ganz komisches. Ich habe dir doch bereits einen Link auf einen CellRenderer geschickt, der nur Dateinamen anzeigt.


----------



## MiMa (12. Mai 2012)

Ich bin halt noch Anfänger und probiere so ziemlich alles durch bis es klappt.
Leider funktioniert es nicht immer.
Mit dem CellRenderer habe ich wie schon o.a. ein paar Verständnisschwierigkeiten.
Da mir auf diese Fragen keiner eine definitive Antwort gab, habe ich nach einer Alternativlösung gesucht und bin zum Netbeans GUI Designer gegangen, statt den gesamten GUI selbst zu coden.

Ich hatte gedacht, damit hätte sich das Problem dann von selbst gelöst aber leider stehe ich nun damit vor dem gleichen Problem. Da ich noch nicht so viel über das Model u.a. Dinge weiss, werde ich erstmal  zurück zur Insel gehen und weiteres Wissen erarbeiten. Denn manchmal kommt es vor, das ich die Syntax ein bisschen durcheinander bringe.

Mi


----------



## XHelp (12. Mai 2012)

Wenn du weiterhin bei GUI Designer bleibst, wirst du es auch nie lernen.


----------



## MiMa (12. Mai 2012)

Ich habe nun die gleiche Arbeit per Code geschrieben und mit dem GUI Designer gemacht, also kenne ich nun beide Möglichkeiten. Das derzeitige Problem ist nun die Codeänderung für bestimmte Darstellungen und ich muss zugeben, das mir dies ein paar Probleme bereitet, wie man in diesem Post lesen kann. 
Ich hatte gedacht, das ich es mit einer Antwort hier aus dem Forum schaffen könnte, aber ich denke, das es für das Grafische Design einer Oberfläche zwar ausreicht, aber die Implementierungen, die abweichen, nicht ausreicht. Da ich mich mit diesem Problem jetzt mehr als eine Woche beschäftige, habe ich mich entschlossen erstmal das AbstractListeModel welches aus nur 4 Zeilen besteht nicht um zu schreiben und es erstmal zu ignorieren und zur Insel zurück zu kehren. ;(

Trotzdem vielen Dank für Eure Hilfe.

Mi


----------



## MiMa (29. Mai 2012)

Ich bin immer noch an dem Problem dran.
Wenn ich das über die Konsole ausgeben, geht es, aber über die Juist bekomme ich das nicht hin.
In vielen Büchern und Seiten habe ich es zu finden Versucht.

Ich bitte um Hilfe, kann mir vielleicht jemand sagen, wie die Liste geändert werden muss, damit
es funktioniert.


```
// Erstellt ein Pfadobjekt
        File filePfad = new File("/Users/michael/Pictures");
        // Erstellt ein Array mit der Größe wie die Anzahl der Dateien
        File[] dateien = filePfad.listFiles();
        // Gibt das Array in einer Liste auf dem GUI aus
        JList liDateiListe = new JList(dateien);
        // Fügt die Dateiliste zum Panel DateiListe hinzu
        panelDateiListe.add(liDateiListe);
                
        // Gibt die Liste auf die Konsole aus
        for (File f : dateien)
        {
            System.out.println(f.getName());
        }
```

vielen Dank

Mi


----------



## XHelp (29. Mai 2012)

Was ist denn konkret das Problem? *Was* bekommst du nicht hin?


----------



## MiMa (29. Mai 2012)

Das konkrete Problem ist, das die Ausgabe in der GUI folgendes ausgibt:

/Users/michael/Pictures/2012-12-08 um 14-58-24.jpg

und die Konsole gibt das gewünschte Ergebnis aus:

2012-12-08 um 14-58-24.jpg

Ich möchte also in der GUI nur den Dateinamen angezeigt bekommen, ohne
Pfad wie die Konsolenausgabe.

Ich bekomme es nicht hin das richtige Ergebnis in die JList zu schreiben.

Mi


----------



## XHelp (29. Mai 2012)

Dann musst du eben einen CellRenderer schreiben, der das wie gewünscht darstellt. Dazu habe ich dir bereits auf der ersten Seite einen Link gegeben.


----------



## MiMa (29. Mai 2012)

Ja hast du und ich habe auch schon mal angefangen diesen zu kommentieren aber den rest verstehe ich nicht.

Ist es wirklich so schwer eine korrekte Konsolenausgabe für eine JList Ausgabe um zu schreiben?
Ist es wirklich nötig weitere Methoden und Renderer schreiben zu müssen?

Ich hatte wirklich gehofft, das man dies mit Java eigenen Methoden wie getName einfach und unkompliziert machen kann.

Es gab jetzt so viele tipps und ich weis nicht wie diese überhaupt umsetzen soll.
Und die Bücher die ich habe ist nicht mal ansatzweise das zu finden was ich hier benötige.

Mi


----------



## XHelp (29. Mai 2012)

Ein Renderer hat eine einzige Methode. Als "so schwer" würde ich das nicht bezeichnen. Es gibt genügend online-Literatur zum Thema Oberflächen und auch Tutorials zum Thema Renderer, so dass man sich das fehlende Wissen leicht aneignen kann.
Der Renderer, den ich dir gezeigt habe hat nur 2 in diesem Zusammenhang relevante Zeilen:

```
JLabel label = new JLabel(file.getName());
return label;
```
(und besteht auch generell nur aus 15 Zeilen) Wenn die diese Zusammenhänge nicht klar sind, dann bist du einfach noch nicht so weit um mit der GUI anzufangen, so dass du dir erstmal noch Grundlagen aneignen musst.


----------



## MiMa (29. Mai 2012)

Ich gebe es auf. ;(

Vielen Dank für die Hilfe.

Mi


----------

