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:
Track:
Vielen Dank im Voraus für alle Antworten
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
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