MP3-Player ProgressBar

felix92

Mitglied
Hallo, und zwar müssen wir für die Uni einen MP3-Player in/mit Java(FX) schreiben
allerdings hängt es derzeit ein wenig an der Umsetzung der ProgressBar (auskommentiert in der Main) vlt. könnte uns da jmd hier helfen !? 🙂

Die ProgressBar müsste folgende Funktionen besitzen:
  • aktuelle Zeit anzeigen des Tracks sowie "mitlaufen" der Kugel
  • beim nächsten Track von t = 0 an (egal ob der Player alleine weiterspielt oder man per next/prev den Track wechselt)
  • beim anklicken an Position in Bar auf exakte Stelle im Track springen1.JPG
Main:
Java:
package musicplayer;

import java.io.File;
import java.util.Vector;

import javafx.application.*;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.Slider;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Duration;


public class Main extends Application {

    Stage window;
    Track track;
    Media media;
    MediaPlayer player;

    TableView<Track> table;
    Button btnPlay, btnPause, btnPrev, btnNext;
    Label lblTitle, lblInterpret;
    Vector<String> trackPaths = new Vector<String>();
    Vector<Track> playlist = new Vector<Track>();
  
    Slider progressBar;
  
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("MuSICKplayer");

        final DirectoryChooser directoryChooser = new DirectoryChooser();

        // Menubar
        Menu fileMenu = new Menu("File");

        MenuItem openFolder = new MenuItem("open Folder");
        openFolder.setOnAction(e -> {
            File dir = directoryChooser.showDialog(primaryStage);
            initDir(dir);

            for (String path : trackPaths) {
                path = path.replaceAll(" ", "%20").replace("\\", "/").replace("[", "%5B").replace("]", "%5D");
                //System.out.println(path);
              
                Media media = new Media("file:///" + path);
                MediaPlayer mediaplayer = new MediaPlayer(media);

                mediaplayer.setOnReady(new Runnable() {
              
                    String title;
                    String album;
                    String artist;
                  
                    @Override
                    public void run() {

                        try {
                           title = media.getMetadata().get("title").toString();
                         // System.out.println(title);
                        } catch(NullPointerException e) {
                            title = "missing";
                        }
                        try {
                            album = media.getMetadata().get("album").toString();
                        } catch (NullPointerException e) {
                            album = "missing";
                        }
                        try {
                            artist = media.getMetadata().get("artist").toString();
                        } catch (NullPointerException e) {
                            try
                            {
                                artist = media.getMetadata().get("album artist").toString();
                            }
                            catch (NullPointerException e1) {
                                artist = "missing";
                            }
                        }
                        final Track track = new Track(media, title, album, artist);
                      
                        playlist.add(track);

                        table.getItems().add(track);
                    }
                });  
              }

        });
      

        fileMenu.getItems().add(openFolder);

        MenuBar menuBar = new MenuBar();
        menuBar.getMenus().addAll(fileMenu);

        // Left Menu
        VBox leftMenu = new VBox();
        Hyperlink linkList[] = new Hyperlink[] { new Hyperlink("Album"), new Hyperlink("Interpret"),
                new Hyperlink("Genre"), new Hyperlink("Playlists") };

        for (int i = 0; i < 4; i++) {
            leftMenu.getChildren().add(linkList[i]);
        }

        // BOTTOM BAR
        GridPane bottomBar = new GridPane();
        bottomBar.setPadding(new Insets(10, 10, 10, 10));
        bottomBar.setVgap(5);
        bottomBar.setHgap(5);
        bottomBar.setAlignment(Pos.CENTER);

        btnPlay = new Button("Play");
        btnPause = new Button("Pause");
        btnPause.setVisible(false);
        btnPrev = new Button("prev");
        btnNext = new Button("next");

        Slider volumeSlider = new Slider();
        volumeSlider.setMin(0);
        volumeSlider.setMax(1);
        volumeSlider.setValue(0.4);

        volumeSlider.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    try {
                        player.setVolume(newValue.doubleValue());
                    } catch (Exception e) {
                }
            }
        });
      
        btnPrev.setOnAction(e -> {
            int index = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(index-1);
            play();
        });

        btnNext.setOnAction(e -> {
            int index = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(index+1);
            play();

        });

        btnPlay.setOnAction(e -> {
            try {
                player.play();
                btnPlay.setVisible(false);
                btnPause.setVisible(true);
            } catch (Exception e2) {
                play();
            }
        });
        btnPause.setOnAction(e -> {
            player.pause();
            btnPlay.setVisible(true);
            btnPause.setVisible(false);
        });
      

        lblTitle = new Label("Titel");
        lblInterpret = new Label("Interpret");

        Slider progressBar = new Slider();

        bottomBar.add(progressBar, 0, 0);
        bottomBar.add(lblTitle, 0, 1);
        bottomBar.add(lblInterpret, 0, 2);
        bottomBar.add(btnPrev, 2, 1);
        bottomBar.add(btnPlay, 3, 1);
        bottomBar.add(btnPause, 3, 1);
        bottomBar.add(btnNext, 4, 1);
        bottomBar.add(volumeSlider, 5, 1);

        TableColumn<Track, String> albumColumn = new TableColumn<>("Album");
        albumColumn.setMinWidth(200);

        TableColumn<Track, String> titleColumn = new TableColumn<>("Titel");
        titleColumn.setMinWidth(200);
      
        TableColumn<Track, String> artistColumn = new TableColumn<>("Interpret");
        artistColumn.setMinWidth(200);
      
        TableColumn<Track, Double> lengthColumn = new TableColumn<>("Länge");
        lengthColumn.setMinWidth(30);
      
      
        albumColumn.setCellValueFactory(new PropertyValueFactory<>("album"));
        titleColumn.setCellValueFactory(new PropertyValueFactory<>("title"));
        artistColumn.setCellValueFactory(new PropertyValueFactory<>("artist"));
        lengthColumn.setCellValueFactory(new PropertyValueFactory<>("duration"));

        table = new TableView<>();
        table.setRowFactory(tv -> {
            TableRow<Track> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    Track rowData = row.getItem();
                    play();
                }
            });
            return row;
        });
        table.setItems(getTracks());
        table.getColumns().addAll(titleColumn, albumColumn, artistColumn, lengthColumn);
      

        BorderPane borderPane = new BorderPane();
        borderPane.setTop(menuBar);
        borderPane.setLeft(leftMenu);
        borderPane.setCenter(table);
        borderPane.setBottom(bottomBar);

        Scene scene = new Scene(borderPane, 1000, 800);
        window.setScene(scene);
        window.show();
    }

    public ObservableList<Track> getTracks() {
        ObservableList<Track> tracks = FXCollections.observableArrayList();
        return tracks;
    }

    public void play() {
        try {
            player.stop();
        } catch (Exception e) {
            // TODO: handle exception
        }
        int index = table.getSelectionModel().getSelectedIndex();
        if (index == -1) {
            table.getSelectionModel().select(0);
            index = 0;
        }
        try {
            player = new MediaPlayer(table.getItems().get(index).getMedia());
            player.play();
            lblTitle.setText(table.getItems().get(index).getTitle());
            lblInterpret.setText(table.getItems().get(index).getArtist());
            btnPlay.setVisible(false);
            btnPause.setVisible(true);
        } catch (Exception e) {
            // TODO: handle exception
        }

        player.setOnEndOfMedia(() -> {
            int ind = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(ind+1);
            play();
        });
  
    }
  
  
    // ProgressBar
    /* TODO:
     * aktuelle Zeit anzeigen des Tracks
     * beim nächsten Track von t = 0 an
     * beim anklicken an Position in Bar auf exakte Stelle im Track springen
     */
/*    public void musickslide() {
        if(player.getStatus() != null) {
            System.out.println(player.getTotalDuration());
            System.out.println(player.getCurrentTime());
            double time = player.getCurrentTime().toSeconds()/player.getTotalDuration().toSeconds();
            thread.sleep(1000);
            }
            progressBar.setValue(time);
        }else {
            progressBar.setValue(0);
        }
    } */

    public void initDir(File dir) {
        File[] files = dir.listFiles();
      

        // Liest Datein aus Ordner + Unterordner
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    initDir(files[i]); // ruft sich selbst mit dem Unterverzeichnis als Parameter auf
                } else {
                    if (files[i].isFile() && files[i].toString().toLowerCase().endsWith(".mp3")) {
                        //table.getItems().add(new Track(files[i].getAbsolutePath()));
                        trackPaths.addElement(files[i].getAbsolutePath().toString());;
                    }
                }
            }
        }
      
    }
}

Track:
Java:
package musicplayer;


import javafx.scene.media.Media;
import javafx.util.Duration;


public class Track {
    public String title;
    private String path;
    private String genre;
    private String artist;
    private String album;
    private String duration;
    private Media media;
      
    public Track(Media media, String title, String album, String artist) {
        this.media = media;
        this.title = title;
        this.album = album;
        this.artist = artist;
        int s = (int) media.getDuration().toSeconds();
        this.duration = String.format("%02d:%02d", (s % 3600) / 60, (s % 60));

    }
      

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getArtist() {
        return artist;
    }


    public void setArtist(String artist) {
        this.artist = artist;
    }


    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }
  
    public String getPath() {
        return path;
    }
  
    public void setPath(String path) {
        this.path = path;
    }


    public Media getMedia() {
        return media;
    }


    public void setMedia(Media media) {
        this.media = media;
    }


    public String getDuration() {
        return duration;
    }


    public void setDuration(String duration) {
        this.duration = duration;
    }

  
}

Vielen Dank im Voraus für alle Antworten 🙂
 
keiner kann helfen? 🙁

Java:
// ProgressBar
    /* TODO:
     * aktuelle Zeit anzeigen des Tracks
     * beim nächsten Track von t = 0 an
     * beim anklicken an Position in Bar auf exakte Stelle im Track springen
     */
/*    public void musickslide() {
        if(player.getStatus() != null) {
            System.out.println(player.getTotalDuration());
            System.out.println(player.getCurrentTime());
            double time = player.getCurrentTime().toSeconds()/player.getTotalDuration().toSeconds();
            thread.sleep(1000);
            }
            progressBar.setValue(time);
        }else {
            progressBar.setValue(0);
        }
    } */
 
Könntest du das komplette Projekt veröffentlichen?
Sodass ich die .zip Datei in Eclipse importieren kann und mir ansehen kann?
Und das Programm ausführen kann?
Wäre gut.
 
Ok, danke, aber...

Wenn ich die Datei ausführen will, bekomme ich ne Fehlermeldung:
"Editor does not contain a main type"

Jemand ne Idee, was ich machen muss?
 
Bei mir kommt immer noch die selbe Fehlermeldung -.-

public class Main extends Application {

Wo ist die Klasse Applicaton? Vielleicht liegt es daran, dass
eben diese Klasse fehlt!
 
allerdings hängt es derzeit ein wenig an der Umsetzung der ProgressBar
Ich glaube, die currentTimeProperty des MediaPlayer könnte helfen. Der Property könnt ihr einen Listener hinzufügen, in dem ihr euch um die Aktualisierung der ProgressBar kümmern könnt.
Bevor ihr etwas neues einbaut würde ich aber vielleicht den Code etwas aufräumen. Das macht die Fehlersuche einfacher, wenn es nicht sofort klappt.
 
@Devanther
Die aktuelle 😀 Sorry, konnte mir es nicht verkneifen.
Was helfen würde: erstelle ein neues JavaFX Projekt, füge beide Klassen (Main, Track), die du im Ordner findest, zu dem Projekt hinzu. Wähle Main-Klasse aus, starte diese. Fertig.
 

Anhänge

  • Thx!.PNG
    Thx!.PNG
    55,8 KB · Aufrufe: 40
soooo da bin ich wieder 😕
immer noch selbes Thema deswegen werf ich es einfach mal in den Raum:

Weiß jmd woran der Fehler liegt ? 🙁

Ausschnitt Main:

Code:
Slider progressBar;
    boolean playing = player.getStatus().equals(Status.PLAYING);

Code:
/*    while(playing = true) {
        // if(playing = true) {System.out.println("Ja"); }else System.out.println("Nein :(" );  // gibt keine Ausgabe
        Double time = player.getTotalDuration().toSeconds();
      
        Slider progressBar = new Slider();
        progressBar.setMin(0);
        progressBar.setMax(time);
        progressBar.setValue(0);
      
        progressBar.maxProperty().bind(Bindings.createDoubleBinding( 
                () -> player.getTotalDuration().toSeconds(),
                player.totalDurationProperty()));
      
        player.currentTimeProperty().addListener((ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) -> {  // mitlaufen der Kugel je nach Lied"zeit"
            progressBar.setValue(newValue.toSeconds());
        });
        progressBar.setOnMouseDragEntered((MouseEvent mouseEvent) -> {   // beim ziehen der Kugel im Lied vor/zurück "springen"
            player.seek(Duration.seconds(progressBar.getValue()));
        });
        progressBar.showTickLabelsProperty();  // Zeitausgabe 
        }  */

Danke 🙂
 
Zuletzt bearbeitet:
Huhu danke erstmal für deine Antwort 🙂
Nein hab das vorhin nur auskommentiert weil es halt noch nicht geht also es gehört schon dazu und es ist hier nur ein Slider hatte vergessen das hier noch zu aktualisieren oben wird deklariert und den Slider unten einfach mal nicht beachten ich korrigiere das hier nachher noch 🙂
 
Ich fasse mal zusammen: Der Code tut nicht, was er soll, wobei unbekannt ist, inwiefern er vom Wunschverhalten abweicht. Außerdem ist unklar, wo der Code sich eigentlich befindet und wie er zur Ausführung kommt. Es ist auch nicht genau der Code, den du gepostet hast, sondern nur so ungefähr. Wie er genau aussieht, weiß man nicht. Aber an den Doppel-Deklarationen kann es definitiv nicht liegen. So viel ist gewiss.

Vielleicht stellst du die Frage doch lieber noch einmal vernünftig.
 
Hallo, und zwar müssen wir für die Uni einen MP3-Player in/mit Java(FX) schreiben
allerdings hängt es derzeit ein wenig an der Umsetzung der ProgressBar (auskommentiert in der Main) vlt. könnte uns da jmd hier helfen !? 🙂

Die ProgressBar müsste folgende Funktionen besitzen:
  • aktuelle Zeit anzeigen des Tracks sowie "mitlaufen" der Kugel
  • beim nächsten Track von t = 0 an (egal ob der Player alleine weiterspielt oder man per next/prev den Track wechselt)
  • beim anklicken an Position in Bar auf exakte Stelle im Track springen


Main:

Code:
package musicplayer;

import java.io.File;
import java.io.InputStream;
import java.util.Vector;

import javafx.application.*;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Slider;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    Stage window;
    InputStream track;
    Media media;
    MediaPlayer player;

    TableView<Track> table;
    Button btnPlay, btnPause, btnPrev, btnNext;
    Label lblTitle, lblInterpret;
    Vector<String> trackPaths = new Vector<String>();
    Vector<Track> playlist = new Vector<Track>();
 
    Slider progressBar;
    boolean playing = player.getStatus().equals(Status.PLAYING);

 
 
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("MuSICKplayer");

        final DirectoryChooser directoryChooser = new DirectoryChooser();

        // Menubar
        Menu fileMenu = new Menu("File");

        MenuItem openFolder = new MenuItem("open Folder");
        openFolder.setOnAction(e -> {
            File dir = directoryChooser.showDialog(primaryStage);
            initDir(dir);

            for (String path : trackPaths) {
                path = path.replaceAll(" ", "%20").replace("\\", "/").replace("[", "%5B").replace("]", "%5D");
                //System.out.println(path);
             
                Media media = new Media("file:///" + path);
                MediaPlayer mediaplayer = new MediaPlayer(media);

                mediaplayer.setOnReady(new Runnable() {
             
                    String title;
                    String album;
                    String artist;
                    String genre;
                 
                    @Override
                    public void run() {

                        try {
                           title = media.getMetadata().get("title").toString();
                         // System.out.println(title);
                        } catch(NullPointerException e) {
                            title = "missing";
                        }
                        try {
                            album = media.getMetadata().get("album").toString();
                        } catch (NullPointerException e) {
                            album = "missing";
                        }
                        try {
                            artist = media.getMetadata().get("artist").toString();
                        } catch (NullPointerException e) {
                            try
                            {
                                artist = media.getMetadata().get("album artist").toString();
                            }
                            catch (NullPointerException e1) {
                                artist = "missing";
                            }
                        }
                        try {
                            genre = media.getMetadata().get("genre").toString();
                        } catch (NullPointerException e) {
                            genre = "missing";
                        }
                        final Track track = new Track(media, title, album, artist, genre);
                     
                        playlist.add(track);

                        table.getItems().add(track);
                    }
                }); 
              }

        });
     

        fileMenu.getItems().add(openFolder);

        MenuBar menuBar = new MenuBar();
        menuBar.getMenus().addAll(fileMenu);

        // Left Menu
        VBox leftMenu = new VBox();
        Hyperlink linkList[] = new Hyperlink[] { new Hyperlink("Album"), new Hyperlink("Interpret"),
                new Hyperlink("Genre"), new Hyperlink("Playlists") };

        for (int i = 0; i < 4; i++) {
            leftMenu.getChildren().add(linkList[i]);
        }
     
        //Album
        linkList[0].setOnAction(e -> {
            table.getItems().removeAll(playlist);
            Vector<String> alben = new Vector<String>();
            boolean check;
            for(Track song : playlist) {
                check = true;
                for(String dummy : alben) {
                    if(song.getAlbum().equals(dummy)) {
                        check = false;
                    }
                }
                if(check == true) {
                    table.getItems().add(song);
                    alben.add(song.getAlbum());
                }
            }
     
            for(String dummy : alben) {
                Vector<Track> album = new Vector<Track>();
                for(Track song : playlist) {
                    if(song.getAlbum().equals(dummy)) {
                        album.add(song);
                    }
                }
                Album alb = new Album(dummy, album);
             
                alb.Test();
            }
         
        });
     
        //Interpret
        linkList[1].setOnAction(e -> {
            table.getItems().removeAll(playlist);
            Vector<String> interpret = new Vector<String>();
            boolean check;
            for(Track song : playlist) {
                check = true;
                for(String dummy : interpret) {
                    if(song.getArtist().equals(dummy)) {
                        check = false;
                    }
                }
                if(check == true) {
                    table.getItems().add(song);
                    interpret.add(song.getArtist());
                }
            }
        });
     
        //Interpret
        linkList[2].setOnAction(e -> {
            table.getItems().removeAll(playlist);
            Vector<String> genre = new Vector<String>();
            boolean check;
            for(Track song : playlist) {
             
                System.out.println(song.getGenre());
             
                check = true;
                for(String dummy : genre) {
                    if(song.getGenre().equals(dummy)) {
                        check = false;
                    }
                }
                if(check == true) {
                    table.getItems().add(song);
                    genre.add(song.getGenre());
                }
            }
        });

        // BOTTOM BAR
        GridPane bottomBar = new GridPane();
        bottomBar.setPadding(new Insets(10, 10, 10, 10));
        bottomBar.setVgap(5);
        bottomBar.setHgap(5);
        bottomBar.setAlignment(Pos.CENTER);

        btnPlay = new Button("Play");
        btnPause = new Button("Pause");
        btnPause.setVisible(false);
        btnPrev = new Button("prev");
        btnNext = new Button("next");

        Slider volumeSlider = new Slider();
        volumeSlider.setMin(0);
        volumeSlider.setMax(1);
        volumeSlider.setValue(0.4);

        volumeSlider.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    try {
                        player.setVolume(newValue.doubleValue());
                    } catch (Exception e) {
                }
            }
        });
     
        btnPrev.setOnAction(e -> {
            int index = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(index-1);
            play();
        });

        btnNext.setOnAction(e -> {
            int index = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(index+1);
            play();

        });

        btnPlay.setOnAction(e -> {
            try {
                player.play();
                btnPlay.setVisible(false);
                btnPause.setVisible(true);
            } catch (Exception e2) {
                play();
            }
        });
        btnPause.setOnAction(e -> {
            player.pause();
            btnPlay.setVisible(true);
            btnPause.setVisible(false);
        });
     
        lblTitle = new Label("Titel");
        lblInterpret = new Label("Interpret");

        while(playing == true) {
        if(playing == true) {System.out.println("Ja"); }else System.out.println("Nein :(" );  //keine Ausgabe
        Double time = player.getTotalDuration().toSeconds();
     
        progressBar = new Slider();
        progressBar.setMin(0);
        progressBar.setMax(time);
        progressBar.setValue(0);
     
        progressBar.maxProperty().bind(Bindings.createDoubleBinding(
                () -> player.getTotalDuration().toSeconds(),
                player.totalDurationProperty()));
     
        player.currentTimeProperty().addListener((ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) -> { // Kugelfortschritt
            progressBar.setValue(newValue.toSeconds());
        });
        progressBar.setOnMouseDragEntered((MouseEvent mouseEvent) -> {   // beim ziehen der Kugel im Lied vor/zurück "springen"
            player.seek(Duration.seconds(progressBar.getValue()));
        });
        progressBar.showTickLabelsProperty();  // Zeitausgabe
        }
     
        bottomBar.add(progressBar, 0, 0);
        bottomBar.add(lblTitle, 0, 1);
        bottomBar.add(lblInterpret, 0, 2);
        bottomBar.add(btnPrev, 2, 1);
        bottomBar.add(btnPlay, 3, 1);
        bottomBar.add(btnPause, 3, 1);
        bottomBar.add(btnNext, 4, 1);
        bottomBar.add(volumeSlider, 5, 1);

        TableColumn<Track, String> albumColumn = new TableColumn<>("Album");
        albumColumn.setMinWidth(200);

        TableColumn<Track, String> titleColumn = new TableColumn<>("Titel");
        titleColumn.setMinWidth(200);
     
        TableColumn<Track, String> artistColumn = new TableColumn<>("Interpret");
        artistColumn.setMinWidth(200);
     
        TableColumn<Track, Double> lengthColumn = new TableColumn<>("Länge");
        lengthColumn.setMinWidth(30);
     
     
        albumColumn.setCellValueFactory(new PropertyValueFactory<>("album"));
        titleColumn.setCellValueFactory(new PropertyValueFactory<>("title"));
        artistColumn.setCellValueFactory(new PropertyValueFactory<>("artist"));
        lengthColumn.setCellValueFactory(new PropertyValueFactory<>("duration"));

        table = new TableView<>();
        table.setRowFactory(tv -> {
            TableRow<Track> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                    Track rowData = row.getItem();
                    play();
                }
            });
            return row;
        });
        table.setItems(getTracks());
        table.getColumns().addAll(titleColumn, albumColumn, artistColumn, lengthColumn);
     

        BorderPane borderPane = new BorderPane();
        borderPane.setTop(menuBar);
        borderPane.setLeft(leftMenu);
        borderPane.setCenter(table);
        borderPane.setBottom(bottomBar);

        Scene scene = new Scene(borderPane, 1000, 800);
        window.setScene(scene);
        window.show();
    }

    public ObservableList<Track> getTracks() {
        ObservableList<Track> tracks = FXCollections.observableArrayList();
        return tracks;
    }
 
 
    public void play() {
        try {
            player.stop();
        } catch (Exception e) {
            // TODO: handle exception
        }
        int index = table.getSelectionModel().getSelectedIndex();
        if (index == -1) {
            table.getSelectionModel().select(0);
            index = 0;
        }
        try {
            player = new MediaPlayer(table.getItems().get(index).getMedia());
            player.play();
            lblTitle.setText(table.getItems().get(index).getTitle());
            lblInterpret.setText(table.getItems().get(index).getArtist());
            btnPlay.setVisible(false);
            btnPause.setVisible(true);
        } catch (Exception e) {
            // TODO: handle exception
        }

        player.setOnEndOfMedia(() -> {
            int ind = table.getSelectionModel().getSelectedIndex();
            table.getSelectionModel().select(ind+1);
            play();
        });
 
    }
 


    public void initDir(File dir) {
        File[] files = dir.listFiles();
     

        // Liest Datein aus Ordner + Unterordner
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    initDir(files[i]); // ruft sich selbst mit dem Unterverzeichnis als Parameter auf
                } else {
                    if (files[i].isFile() && files[i].toString().toLowerCase().endsWith(".mp3")) {
                        //table.getItems().add(new Track(files[i].getAbsolutePath()));
                        trackPaths.addElement(files[i].getAbsolutePath().toString());;
                    }
                }
            }
        }
     
    }
}

Track:

Code:
package musicplayer;


import javafx.scene.media.Media;
import javafx.util.Duration;


public class Track {
    public String title;
    private String path;
    private String genre;
    private String artist;
    private String album;
    private String duration;
    private Media media;
     
    public Track(Media media, String title, String album, String artist, String genre) {
        this.media = media;
        this.title = title;
        this.album = album;
        this.artist = artist;
        this.genre = genre;
        int s = (int) media.getDuration().toSeconds();
        this.duration = String.format("%02d:%02d", (s % 3600) / 60, (s % 60));

    }
     

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getArtist() {
        return artist;
    }


    public void setArtist(String artist) {
        this.artist = artist;
    }


    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }
 
    public String getPath() {
        return path;
    }
     
    public void setPath(String path) {
        this.path = path;
    }


    public Media getMedia() {
        return media;
    }


    public void setMedia(Media media) {
        this.media = media;
    }


    public String getDuration() {
        return duration;
    }


    public void setDuration(String duration) {
        this.duration = duration;
    }

 
}

Album:

Code:
package musicplayer;

import java.util.Vector;

public class Album {
    private String album;
    private Vector<Track> albumlist = new Vector<Track>();
 
    public Album(String album, Vector<Track> albumlist) {
        this.album = album;
        this.albumlist = albumlist;
    }
 
    public void Test() {
        System.out.println(album + "\n" );
     
        for(Track song : albumlist) {
            System.out.println(song.getTitle());
        }
     
        System.out.println("\n");
    }
}

Das Problem liegt vermutlich hier (aus Main):

Code:
while(playing == true) {
        if(playing == true) {System.out.println("Ja"); }else System.out.println("Nein :(" );  //keine Ausgabe
        Double time = player.getTotalDuration().toSeconds();
     
        progressBar = new Slider();
        progressBar.setMin(0);
        progressBar.setMax(time);
        progressBar.setValue(0);
     
        progressBar.maxProperty().bind(Bindings.createDoubleBinding(
                () -> player.getTotalDuration().toSeconds(),
                player.totalDurationProperty()));
     
        player.currentTimeProperty().addListener((ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) -> { // Kugelfortschritt
            progressBar.setValue(newValue.toSeconds());
        });
        progressBar.setOnMouseDragEntered((MouseEvent mouseEvent) -> {   // beim ziehen der Kugel im Lied vor/zurück "springen"
            player.seek(Duration.seconds(progressBar.getValue()));
        });
        progressBar.showTickLabelsProperty();  // Zeitausgabe
        }
     
        bottomBar.add(progressBar, 0, 0);

Ich hoffe es ist jetzt besser nachvollziehbar.
Danköö 🙂 Bild + zip im Anhang
 

Anhänge

Problem gelöst es war einfach an der falschen Stelle und wurde immer beim player starten aufgerufen und nicht erst wenn ein Track abgespielt wird.

Vielen Dank 🙂

/closed
 

Zurück
Oben