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 🙂