diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e45147d..960ac00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,21 +11,31 @@
UTF-8
-5.10.2
+ 5.10.2
+
+ 21
+ 21.0.4
+
org.openjfx
javafx-controls
- 21
+ ${javafx.version}
org.openjfx
javafx-fxml
- 21
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-media
+ ${javafx.version}
-
+
+
org.junit.jupiter
junit-jupiter-api
${junit.version}
@@ -36,39 +46,30 @@
junit-jupiter-engine
${junit.version}
test
-
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
3.13.0
- 23
- 23
+ ${maven.compiler.release}
+
org.openjfx
javafx-maven-plugin
0.0.8
-
-
-
- default-cli
-
- sbu.javafx/sbu.javafx.MusicApp
- app
- app
- app
- true
- true
- true
-
-
-
+
+ sbu.javafx/sbu.javafx.MusicApp
+
+
\ No newline at end of file
diff --git a/src/main/java/sbu/javafx/Launcher.java b/src/main/java/sbu/javafx/Launcher.java
index c288d10..6351bdc 100644
--- a/src/main/java/sbu/javafx/Launcher.java
+++ b/src/main/java/sbu/javafx/Launcher.java
@@ -2,7 +2,10 @@ package sbu.javafx;
import javafx.application.Application;
-public class Launcher{
- public static void main(String[] args) {
- // TODO: Launch the JavaFX application by calling Application.launch(Main.class) }
-}
+public class Launcher
+{
+ public static void main(String[] args)
+ {
+ Application.launch(MusicApp.class, args);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/sbu/javafx/MusicApp.java b/src/main/java/sbu/javafx/MusicApp.java
index a50badc..9810d80 100644
--- a/src/main/java/sbu/javafx/MusicApp.java
+++ b/src/main/java/sbu/javafx/MusicApp.java
@@ -7,8 +7,8 @@ import javafx.stage.Stage;
import java.io.IOException;
-public class MusicApp extends Application {
-
+public class MusicApp extends Application
+{
@Override
public void start(Stage stage) throws IOException
{
@@ -16,8 +16,7 @@ public class MusicApp extends Application {
Scene scene = new Scene(fxmlLoader.load());
stage.setTitle("Music Player");
stage.setScene(scene);
- //TODO: add icon to the stage
+ stage.setResizable(false);
stage.show();
}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/sbu/javafx/MusicController.java b/src/main/java/sbu/javafx/MusicController.java
index 5da27a9..b19baeb 100644
--- a/src/main/java/sbu/javafx/MusicController.java
+++ b/src/main/java/sbu/javafx/MusicController.java
@@ -1,31 +1,176 @@
package sbu.javafx;
import javafx.fxml.FXML;
-import javafx.event.ActionEvent;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
import javafx.scene.control.Label;
-import javafx.scene.input.MouseEvent;
+import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
+import javafx.scene.media.Media;
+import javafx.scene.media.MediaPlayer;
+import javafx.stage.Stage;
-public class MusicController {
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
- // TODO: Define your UI components using the @FXML annotation.
+public class MusicController
+{
+ @FXML private VBox rootPane;
+ @FXML private Label titleLabel;
+ @FXML private Label nowPlayingLabel;
- //TODO: Implement the logic to play a song. This method should update the UI to show which song is currently playing.
+ @FXML private Button playBtn1;
+ @FXML private Button playBtn2;
+ @FXML private Button playBtn3;
+
+ private final List playlist = new ArrayList<>();
+ private MediaPlayer mediaPlayer;
+ private boolean darkTheme = false;
+
+ private final String song1 = "Careless Whisper";
+ private final String song2 = "Adore You";
+ private final String song3 = "Wildflower";
+
+ private final String song1File = "/sbu/javafx/audio/careless_whisper.mp3";
+ private final String song2File = "/sbu/javafx/audio/adore_you.mp3";
+ private final String song3File = "/sbu/javafx/audio/wildflower.mp3";
@FXML
- public void handlePlayAction() {
- //Update labels, change button icons, etc.
+ private void initialize() {updateNowPlaying("None");applyLightTheme();}
+
+ @FXML
+ public void handlePlay1() {playSong(song1, song1File, playBtn1);}
+
+ @FXML
+ public void handlePlay2() {playSong(song2, song2File, playBtn2);}
+
+ @FXML
+ public void handlePlay3() {playSong(song3, song3File, playBtn3);}
+
+ @FXML
+ public void handleAdd1() {addToPlaylist(song1);}
+
+ @FXML
+ public void handleAdd2() {addToPlaylist(song2);}
+
+ @FXML
+ public void handleAdd3() {addToPlaylist(song3);}
+
+ @FXML
+ public void handleViewPlaylist()
+ {
+ Stage stage = new Stage();
+
+ VBox root = new VBox(10);
+ root.setStyle("-fx-padding: 16; -fx-background-color: white;");
+
+ Label title = new Label("My Playlist");
+ title.setStyle("-fx-font-size: 18px; -fx-font-weight: bold;");
+
+ ListView listView = new ListView<>();
+ listView.getItems().addAll(playlist);
+
+ root.getChildren().addAll(title, listView);
+
+ Scene scene = new Scene(root, 300, 400);
+ stage.setScene(scene);
+ stage.setTitle("Playlist");
+ stage.show();
}
- //TODO: Logic to add a specific song to the user's playlist.
+ @FXML
+ public void handleToggleTheme()
+ {
+ darkTheme = !darkTheme;
- public void addToPlaylist(String songName) {
- //Add the song to a list or update a ListView.
+ if (darkTheme) {applyDarkTheme();}
+ else {applyLightTheme();}
}
- // TODO:This method should open a new window or change the current scene to display the "Playlist" page.
+ private void playSong(String songName, String resourcePath, Button playButton)
+ {
+ try
+ {
+ if (mediaPlayer != null)
+ {
+ mediaPlayer.stop();
+ mediaPlayer.dispose();
+ }
- public void openPlaylistWindow() {
- //Create a new stage and show the playlist UI.
+ URL url = getClass().getResource(resourcePath);
+ if (url == null)
+ {
+ updateNowPlaying(songName + " (file not found)");
+ return;
+ }
+
+ Media media = new Media(url.toExternalForm());
+ mediaPlayer = new MediaPlayer(media);
+ mediaPlayer.play();
+
+ updateNowPlaying(songName);
+
+ if (playBtn1 != null) playBtn1.setText("Play");
+ if (playBtn2 != null) playBtn2.setText("Play");
+ if (playBtn3 != null) playBtn3.setText("Play");
+
+ if (playButton != null) {playButton.setText("Playing");}
+
+ }
+ catch (Exception e)
+ {
+ updateNowPlaying(songName + " (error)");
+ e.printStackTrace();
+ }
}
-}
+
+ private void addToPlaylist(String songName)
+ {
+ if (!playlist.contains(songName)) {playlist.add(songName);}
+ }
+
+ private void updateNowPlaying(String text)
+ {
+ if (nowPlayingLabel != null)
+ {
+ nowPlayingLabel.setText("Now Playing: " + text);
+ }
+ }
+
+ private void applyDarkTheme()
+ {
+ if (rootPane != null)
+ {
+ rootPane.setStyle("-fx-padding: 24;" + "-fx-background-color: #121212;");
+ }
+
+ if (titleLabel != null)
+ {
+ titleLabel.setStyle("-fx-font-size: 26px;" + "-fx-font-weight: bold;" + "-fx-text-fill: white;");
+ }
+
+ if (nowPlayingLabel != null)
+ {
+ nowPlayingLabel.setStyle("-fx-padding: 12;" + "-fx-background-color: #1E1E1E;" + "-fx-background-radius: 10;" + "-fx-border-color: #444444;" + "-fx-border-radius: 10;" + "-fx-text-fill: white;");
+ }
+ }
+
+ private void applyLightTheme()
+ {
+ if (rootPane != null)
+ {
+ rootPane.setStyle("-fx-padding: 24;" + "-fx-background-color: #F8F8F8;");
+ }
+
+ if (titleLabel != null)
+ {
+ titleLabel.setStyle("-fx-font-size: 26px;" + "-fx-font-weight: bold;" + "-fx-text-fill: #222222;");
+ }
+
+ if (nowPlayingLabel != null)
+ {
+ nowPlayingLabel.setStyle("-fx-padding: 12;" + "-fx-background-color: white;" + "-fx-background-radius: 10;" + "-fx-border-color: rgba(0,0,0,0.15);" + "-fx-border-radius: 10;" + "-fx-text-fill: black;");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/sbu/javafx/App-view.fxml b/src/main/resources/sbu/javafx/App-view.fxml
index 306c8d3..c1a5184 100644
--- a/src/main/resources/sbu/javafx/App-view.fxml
+++ b/src/main/resources/sbu/javafx/App-view.fxml
@@ -1,8 +1,114 @@
+
+
+
+
+
+
+
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/sbu/javafx/audio/adore_you.mp3 b/src/main/resources/sbu/javafx/audio/adore_you.mp3
new file mode 100644
index 0000000..274dac2
Binary files /dev/null and b/src/main/resources/sbu/javafx/audio/adore_you.mp3 differ
diff --git a/src/main/resources/sbu/javafx/audio/careless_whisper.mp3 b/src/main/resources/sbu/javafx/audio/careless_whisper.mp3
new file mode 100644
index 0000000..aaa81e6
Binary files /dev/null and b/src/main/resources/sbu/javafx/audio/careless_whisper.mp3 differ
diff --git a/src/main/resources/sbu/javafx/audio/wildflower.mp3 b/src/main/resources/sbu/javafx/audio/wildflower.mp3
new file mode 100644
index 0000000..4085864
Binary files /dev/null and b/src/main/resources/sbu/javafx/audio/wildflower.mp3 differ
diff --git a/src/main/resources/sbu/javafx/css/dark.css b/src/main/resources/sbu/javafx/css/dark.css
new file mode 100644
index 0000000..7c0a993
--- /dev/null
+++ b/src/main/resources/sbu/javafx/css/dark.css
@@ -0,0 +1,12 @@
+.root {
+ -fx-background-color: #1e1e1e;
+}
+
+.label {
+ -fx-text-fill: white;
+}
+
+.button {
+ -fx-background-color: #444;
+ -fx-text-fill: white;
+}
\ No newline at end of file
diff --git a/src/main/resources/sbu/javafx/css/light.css b/src/main/resources/sbu/javafx/css/light.css
new file mode 100644
index 0000000..de63139
--- /dev/null
+++ b/src/main/resources/sbu/javafx/css/light.css
@@ -0,0 +1,12 @@
+.root {
+ -fx-background-color: white;
+}
+
+.label {
+ -fx-text-fill: black;
+}
+
+.button {
+ -fx-background-color: #e0e0e0;
+ -fx-text-fill: black;
+}
\ No newline at end of file
diff --git a/src/main/resources/sbu/javafx/images/add.png b/src/main/resources/sbu/javafx/images/add.png
new file mode 100644
index 0000000..10691a8
Binary files /dev/null and b/src/main/resources/sbu/javafx/images/add.png differ
diff --git a/src/main/resources/sbu/javafx/images/play.png b/src/main/resources/sbu/javafx/images/play.png
new file mode 100644
index 0000000..b49f598
Binary files /dev/null and b/src/main/resources/sbu/javafx/images/play.png differ
diff --git a/src/main/resources/sbu/javafx/images/playlist.png b/src/main/resources/sbu/javafx/images/playlist.png
new file mode 100644
index 0000000..f409e15
Binary files /dev/null and b/src/main/resources/sbu/javafx/images/playlist.png differ
diff --git a/src/main/resources/sbu/javafx/images/theme.png b/src/main/resources/sbu/javafx/images/theme.png
new file mode 100644
index 0000000..ed7e928
Binary files /dev/null and b/src/main/resources/sbu/javafx/images/theme.png differ