# Java: JList Frage



## BurningSky1994 (19. Juni 2014)

Ich bin gerade dabei einen MP3 player zu programmieren. Die Auswahl der Lieder soll über eine JList erfolgen.
Dies klappt soweit nun habe ich die Frage ob man die in der JList angezeigten Werte ändern kann ohne den eigentlichen inhalt der liste zu ändern.

Momentan wird der Dateipfad angezeigt da ich diesen brauche um die Lieder abzuspielen muss ich diesen der JList hinzufügen ich hätte allerdings gerne das nur der Name der Datei angezeigt wird.
Ist das möglich oder muss ich es wohl oder übel so lassen ?
Neue einträge werden über einen FileChooser hinzugefügt.

Mit freundlichen grüßen,
BurningSky


----------



## DKK007 (19. Juni 2014)

Vielleicht einfach zwei Listen mit gleichem Index. Die eine ist im Vordergrund und hat die Dateinamen, die im Hintergrund liegende Liste enthält die Pfade+Datei. Anstelle einer JList könnte man dafür dann auch einfach ein Array oder eine ArrayList verwenden.


----------



## Rho (19. Juni 2014)

> Vielleicht einfach zwei Listen mit gleichem Index.


Oder vielleicht besser nicht...

Ich musste schon eine Weile nichts mehr mit Java machen und bin mir deshalb nicht ganz sicher, ob es die beste Möglichkeit ist (vermutlich nicht), aber dafür sollte es einfach umsetzbar sein. Anstatt die Liste mit Strings zu befüllen, erstellst du eine "Song"-Klasse und befüllst die Liste mit Objekten diesen Typs. In diesen Song-Objekten kannst du dann den Pfad zum jeweiligen Lied speichern und die die toString-Methode entsprechend überschreiben. In der Liste wird dann das angezeigt, was toString zurückgibt.


----------



## BurningSky1994 (19. Juni 2014)

Wenn ich 2 Listen erstelle wird dann nicht nur die obere anklickbar ?

Naja ich denke nicht das das geht oder ich verstehe es falsch^^

Mit einem FileChooser wähle ich die datei aus uns speicher sie in einem File Typ namens lieder.



> public File listeVomChooser() {
> JFileChooser chooser = new JFileChooser(userhome + "\\Music");
> FileFilter filter = new FileNameExtensionFilter("Musik", "mp3");
> chooser.addChoosableFileFilter(filter);
> ...



Mit dem auskommentierten String[] lieder bekomme ich direkt nur die dateinamen in der liste angezeigt aber dann fehlen eben die vorangehenden Pfade und ich kann die Datei nicht einlesen.

Das File lieder wird dann in einen Vektor eingelesen(da sonst nur sowas wie "Ljava.lang.String@2h34k23" angezeigt wird) und dieser Vektor wird dann zur JList hinzugefügt.


> Vector listen = new Vector(Arrays.asList(listeVomChooser()));
> meineListe.setModel(listmodel);
> ((DefaultListModel) listmodel).addElement(listen);



Nun wandle ich im ListSelectionListener den Inhalt des ausgewählten Listenelements in einen String um entferne die Klammern die den Listenelementen hinzugefügt werden und wandle den String wieder in ein File um



> datei1 = meineListe.getSelectedValue().toString();
> datei1 = datei1.replace("[", "");
> datei1 = datei1.replace("]", "");
> musikdatei = new File(datei1);



Edit:
Noch ne Frage und zwar: Ist es möglich ganze Ordner auf einmal einzulesen ?


----------



## DKK007 (19. Juni 2014)

BurningSky1994 schrieb:


> Edit:
> Noch ne Frage und zwar: Ist es möglich ganze Ordner auf einmal einzulesen ?


 
Wenn mit Unterordnern, einfach Rekursiv.


----------



## BurningSky1994 (19. Juni 2014)

Also ich meine in nem Ordner sind viele Dateien die ich alle aufeinmal hinzufügen will.


----------



## DKK007 (19. Juni 2014)

Wie wäre es damit: Galileo Computing :: Java ist auch eine Insel – 16 Dateien, Verzeichnisse und Dateizugriffe


----------



## Rho (19. Juni 2014)

BurningSky1994 schrieb:


> Also ich meine in nem Ordner sind viele Dateien die ich alle aufeinmal hinzufügen will.




```
chooser.setMultiSelectionEnabled(true);
```

Das Beispiel ist nicht schön, aber macht genau das, was du willst.

https://gist.github.com/elcattivo/ebac80c90f1ee51ff452

Nichts für ungut, aber deine Code-Schnippsel sehen so aus, als wüsstest du nicht wirklich, was du tust. Eventuell solltest du vorerst auf eine GUI in deinen Programmen verzichten und dich mit den Grundlagen vertraut machen.



DKK007 schrieb:


> Wie wäre es damit: Galileo Computing :: Java ist auch eine Insel – 16 Dateien, Verzeichnisse und Dateizugriffe


Und was hat das nun mit seiner Frage zu tun?


----------



## BurningSky1994 (20. Juni 2014)

Die GUI hab ich ja schon fertig und es funktioniert soweit alles geht nur darum diesen "Schönheitsfehler" zu beheben und Ahnung hab ich eig. auch nur viele Sachen "klatsch" ich schnell hin zum testen meistens mit viel zu viel Code und berichtige sie dann wenn es geht.

Das Problem an der multi selection ist das alles dann in einem einzigen JList Feld gespeichert wird was das Auslesen der ID3 Tags und das übergeben der Datei an den Player unmöglich macht.


----------



## DKK007 (20. Juni 2014)

Ich dachte er muss sie erst noch in die Listbox einlesen.


----------



## BurningSky1994 (20. Juni 2014)

Einlesen und alles andere geht nur wollte ich zum einen wissen ob man iwie den angezeigten Text der JList ändern kann und ob man gleich ganze Ordner einlesen kann so das jede datei ein einzelnes Feld bekommt so das man nicht jede Datei einzeln einlesen muss^^

Das Bild im Anhang des ersten Posts zeigt das Programm und eben das Problem das ich meine.


----------



## LastChaosTyp (20. Juni 2014)

Ich hab zwar keine Ahnung von Java, aber in Python gibt es Dictionarys. Das ist ein Dateityp, in dem man immer einen Schlüssel(Hier der Song-Name) und einen Wert (Dateipfad) speichern kann. Diese Wertepaare kann man dann aneinanderhöngen und man hat den Dictionary. Wenn man dann den entsprechenden Schlüssel(SongName) aufruft, wird der Wert(Pfad) ausgegeben und man kann damit weiterarbeiten


----------



## DKK007 (20. Juni 2014)

Je nachdem wie du dich mit OOP auskennst, wofür man Java ja eigentlich nutzt, könntest du einfach eine Klasse Song erstellen, die als Atribute Dateiname, Pfad und vielleicht noch weitere Informationen (Sänger, Band, Album usw.) enthält. Dann erstellst du einfach eine ArrayList mit dem enthalten Typ Song.


----------



## Rho (20. Juni 2014)

BurningSky1994 schrieb:


> Ahnung hab ich eig. auch


Da schätzt du dich leider falsch ein.



> ```
> // String[] lieder = {chooser.getName(chooser.getSelectedFile())};
> ```
> 
> ...



Die beiden Beispiele sprechen für sich selbst.



BurningSky1994 schrieb:


> Das Problem an der multi selection ist das alles dann in einem einzigen JList Feld gespeichert wird was das Auslesen der ID3 Tags und das übergeben der Datei an den Player unmöglich macht.



Ich kann dein Problem leider nicht nachvollziehen. Eventuell kannst du es ja etwas genauer erläutern. Du könntest aber auch einfach dein Projekt auf z.B. GitHub veröffentlichen. Dann könnte man zum einen einen besseren Eindruck davon bekommen, was du bis jetzt so alles machst und dir auch gleich bezüglich deiner Fragen entsprechende Änderungen zukommen lassen.


----------



## BurningSky1994 (20. Juni 2014)

Den Vektor habe ich mitlerweile durch nen normalen String ersetzt und das String-Array war noch von nem Kollegen.

Nun ja wenn ich die MultiSelection setze wird mir das Array so ausgegeben:

[C:\Users\Kevin\Music\playlist\Alles\01 - Lost In The Echo.mp3, C:\Users\Kevin\Music\playlist\Alles\01 - Rise.mp3, C:\Users\Kevin\Music\playlist\Alles\04 - Not Gonna Die.mp3]

und dann eben nur als ein Element eingelesen wie im Anhang dadurch kann ich die ID3 Tags, die Laufzeit nicht mehr auslesen und die dateien nicht abspielen.

Ob ich es auf GitHub veröffentlichen darf muss ich erst meine Kollegen fragen.

Werde wohl mal eine ArrayList versuchen.


----------



## Rho (20. Juni 2014)

Wenn ich deine Bemerkungen so lese, frage ich mich, ob du dir meinen Beispiel-Code überhaupt angesehen hast.


----------



## BurningSky1994 (20. Juni 2014)

Den GitHub Code habe ich übersehen tut mir leid.

Danke hat perfekt Funktioniert.


----------

