Playlist mit Track

babuschka

Top Contributor
Hallo, ich habe folgende Klassen: Playlist, Track und Mp3Klasse;

Ich möchte die Tracks in die Playlist speichern und diese dann mit der play()Methode von Klasse MP3Player abspielen. Ich bekomm folgenden Fehler bei der Methode getSoundFile():
Konstruktor für FileinputStream(Track) nicht gefunden

Java:
public class Track {

    String title;
    int lenght;
    String albumTitle;
    String soundFileString;
    String genre;
    FileInputStream datei;
    AudioHeader audioHeader;
    MP3File mp3File;
    AbstractID3v2Tag v2tag;
    String coverFile;
    Playlist soundFilePlaylist;

    public Track(String soundFileString) {
        this.soundFileString = soundFileString;
        System.out.println("Track Konst: " + soundFileString);
        
    }

public FileInputStream getSoundFile() {

        MyTransferHandler transferHandler;

        try {
           //datei = new FileInputStream(soundFileString);
            datei = new FileInputStream(soundFilePlaylist.panel1List.get(0));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return datei;
    }
}


Java:
class MyTransferHandler extends Transferhandler{
public boolean importData(TransferSupport info) {
        if (!canImport(info)) {
            return false;
        }
        //Transferobjekt holen
        Transferable transfer = info.getTransferable();

        try {
            listFile = (List) transfer
                    .getTransferData(DataFlavor.javaFileListFlavor);

            for (File aktFile : listFile) {

                Track importedTrack = new Track(aktFile.getAbsolutePath());
                //mp3Player.play(importedTrack);
                
                playlist.addTrack(importedTrack);
                

            }
}
Java:
Class Track{
public FileInputStream getSoundFile() {

        MyTransferHandler transferHandler;

        try {
           //datei = new FileInputStream(soundFileString);
            datei = new FileInputStream(soundFilePlaylist.panel1List.get(0));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return datei;
    }
}
}

Java:
class Mp3Player{
 public void play(Track importTrack) {
        actTrack = importTrack;
        try {

            new Thread() {

                public void run() {
                    try {
                        mp3Player = new Player(actTrack.getSoundFile());

                        mp3Player.play();


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            Gui gui = new Gui();

                        }
                    });

                }
            }.start();



        } catch (Exception r) {
            r.printStackTrace();
        }

    }
    
}


Vielen Dank für eure Hilfe :toll:
 

babuschka

Top Contributor
Ich weiß das mein FileInputstream einen String erwartet aber meine Playlist nimmt Track Objekte hinzu.
Wie kann ich diese in String Casten und es dem FIS übergeben?
 
Y

yyannekk

Gast
Du könntest in der Track Klasse die toString() Methode überschreiben (schreib einfach eine Methode String toString() in der Klasse Track). Diese Methode sollte dann einen String zurückliefern der den Track beschreibt (mithilfe der Membervariablen...)
dem FIS gibst übergibst du dann soundFilePlaylist.panel1List.get(0).toString()
 
N

nillehammer

Gast
Erst mal einige allgemeine Hinweise:
- Speichere den FileInputStream nicht als Instanzvariable. Das ist für Deinen Anwendungsfall überflüssig und auch sonst eher fragwürdig. Streams sind wegwerf-Objekte, sprich sie werden geöffnet, zum lesen/schreiben genutzt, geclosed und weggeschmissen. Man sollte Referenzen nicht langlebig in Instanzvariablen speichern.
- Du brauchst allgemein einen InputStream, aus dem Du die Daten zum Abspielen liest. Lege Dich nicht unnötig auf FileInputStream fest (zumal der nicht gepuffert ist).

Und zur Frage:
Speichere Dir tatsächich den voll qualifizierten Pfad als URL-String in einer Instanzvariablen. Dann kannst Du in der Methode getSoundFile() folgendes machen:
Java:
return new URL(mp3UrlString).openStream();
Ein gültiger URL-String für ein File unter Windows sieht so aus:
"file:C:/..."
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
yyannekk hat gesagt.:
Du könntest in der Track Klasse die toString() Methode überschreiben (schreib einfach eine Methode String toString() in der Klasse Track).
Die toString()-Methode sollte man nicht für fachliche Arbeit missbrauchen. Sie ist einzig und allein für die Repräsentation eines Objekts z.B. in Logausgaben gedacht.
 
S

Spacerat

Gast
Track müsste nur von InputStream erben, weil FileInputStream (wie jeder andere Stream auch) mit anderen gleichartigen Streams geschachtelt werden kann.
Aber das Ganze hinkt so ein wenig, weil die Streams ja dann immer geöffnet bleiben müssten. Es wäre also ratsam, in der Playlist nur die URLs zu speichern und dann wie nillehammer es bereits geschrieben hat, sich einen Stream mit "url.openStream()" besorgen.
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
Danke für die Antwort.

Das Konzept ist jedoch, dass
die Tracks per Drag and Drop in das Panel gezogen werden und diese dan in die Playlist gespeichert werden. Der Path vom Track wird übergeben
 
S

Spacerat

Gast
Aus dem Path machst du ein Fileobject und dann per "toURI().toURL()" die gewünscht URL. Ist das machbar?
 

babuschka

Top Contributor
In der Klasse MyTransferHandler

dann hat mein Track einen Konstruktor

Java:
Track importedTrack = new Track(aktFile.getAbsolutePath());
 
S

Spacerat

Gast
Also doch machbar...
Java:
import java.io.File;
import java.io.InputStream;
import java.net.URL;

class MyTransferHandler extends Transferhandler {
	public boolean importData(TransferSupport info) {
		if (!canImport(info)) {
			return false;
		}
		//Transferobjekt holen
		Transferable transfer = info.getTransferable();
 
		try {
			listFile = (List) transfer.getTransferData(DataFlavor.javaFileListFlavor);
 
			for (File aktFile : listFile) {
				URL importedTrack = aktFile.toURI().toURL();
				playlist.addTrack(new Track(importedTrack));
            }
		}
	}
}

class Track {
	 
    String title;
    int lenght;
    String albumTitle;
    String genre;
    URL soundURL;
    AudioHeader audioHeader;
    MP3File mp3File;
    AbstractID3v2Tag v2tag;
    String coverFile;
    Playlist soundFilePlaylist;
 
    public Track(URL soundURL) {
        this.soundURL = soundURL;
        System.out.println("Track Konst: " + soundURL);
        
    }
 
public InputStream getSoundFile() {
 
        MyTransferHandler transferHandler;
 
        try {
            return soundURL.openStream();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
 

babuschka

Top Contributor
Nun wenn ich den Track reinziehe und klicke zeigt er mir zwar an, es wurde geklickt aber bekomme folgende Fehlermeldung

Exception in thread "Thread-3" java.lang.NoSuchMethodError: Data.Track.getSoundFile()Ljava/io/FileInputStream;
at BuisnessLogik.MP3Player$2.run(MP3Player.java:59)
 

babuschka

Top Contributor
Den Fehler hab ich beseitig.

Wie kann ich nun in der Gui sagen, falls der Nutzer auf Panel 1 klickt, dass playlist1 dem Panel1 zugehört
Java:
public void mouseClicked(MouseEvent e) {
        panel = (JPanel) e.getSource();
        System.out.print("Wurde geklickt");

        // Reihe 1 ----------------------------------------- 
        
        // Panel 1, Genre: 
        if (panel.getName().equals("x=0, y=0")) 
            panel.setBackground(new Color(86, 144, 153));
}
 
S

Spacerat

Gast
Java:
public void mouseClicked(MouseEvent e) {
        panel = (JPanel) e.getSource();
        System.out.print("Wurde geklickt");
 
        // Reihe 1 ----------------------------------------- 
        
        // Panel 1, Genre: 
        if (panel.getName().equals("x=0, y=0")) {
            panel.setBackground(new Color(86, 144, 153));

            mp3Player.play(int index); // wenn sich die Playlist im MP3Player befindet.
            mp3Player.play(getPlayList().get(index)): // Wo auch immer die Playlist
            // zu finden ist, "getPlaylist()" muss diese zurückgeben.
        }
}
[EDIT]Aber wenn ich noch mal nachlese, willst du, dass einem Panel 'ne gesamte Playlist zusteht. Dann kanst du diese entweder im Panel als Member oder alle zusammen in einer Map<Panel, PlayList> halten.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
das Problem ist nur.... wenn ich das Lied in importiere
und es der der Playlist adde, check ich ja nicht ab in welchem Panel der User das Lied hineinzieht.
zu jedem Panel sollte eine Playliste erstellt werden

Java:
 public void addTrack(Track track){
        actTrack = track;
        
            
            //Panel 1
            panel1List.add(actTrack);
            
            //Panel 2
            panel2List.add(actTrack);
            
            //Panel 3
            panel3List.add(actTrack);

       
       
    }//Ende addTrack Methode

Mein Prof meinte, ich sollte das in der GUI machen, indem ich sage dass die Playliste diese Playlist ist.Aber keine Ahnung wie ich das nun umsetzen soll:bahnhof:
 

babuschka

Top Contributor
PS: Wenn ich es nun mit URL machen, kann ich die id3Tags aus dem File nicht rauslesen

Java:
public void getId3Tags() throws CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, IOException {

        try {

            File testFile = new File(soundFileString);

            mp3File = (MP3File) AudioFileIO.read(testFile);
            v2tag = mp3File.getID3v2Tag();
            title = (v2tag.getFirst(ID3v24Frames.FRAME_ID_TITLE));

            genre = (v2tag.getFirst(ID3v24Frames.FRAME_ID_GENRE));
            albumTitle = (v2tag.getFirst(ID3v24Frames.FRAME_ID_ALBUM));

        } catch (IOException ex) {
            ex.printStackTrace();
        }


    }

FEHLER: File benötigt String, bekommt jedoch URL
 

Ähnliche Java Themen


Oben