From fdfb2a06ebd643437cbfe4b3c0fa511c18121b76 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Mon, 15 Jun 2026 01:15:24 +0330 Subject: [PATCH] fininsh --- .idea/vcs.xml | 6 + icon.png | Bin 0 -> 6635 bytes src/main/java/sbu/javafx/Launcher.java | 3 +- src/main/java/sbu/javafx/MusicApp.java | 8 +- src/main/java/sbu/javafx/MusicController.java | 157 +++++++++++++++++- .../java/sbu/javafx/PlaylistController.java | 39 +++++ src/main/resources/sbu/javafx/App-view.fxml | 62 ++++++- .../resources/sbu/javafx/Playlist-view.fxml | 23 +++ src/main/resources/sbu/javafx/dark.css | 66 ++++++++ src/main/resources/sbu/javafx/light.css | 69 ++++++++ 10 files changed, 422 insertions(+), 11 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 icon.png create mode 100644 src/main/java/sbu/javafx/PlaylistController.java create mode 100644 src/main/resources/sbu/javafx/Playlist-view.fxml create mode 100644 src/main/resources/sbu/javafx/dark.css create mode 100644 src/main/resources/sbu/javafx/light.css 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/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..46ff180b9e9e6eb2399ef1a98102aa45090a30a7 GIT binary patch literal 6635 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 literal 0 HcmV?d00001 diff --git a/src/main/java/sbu/javafx/Launcher.java b/src/main/java/sbu/javafx/Launcher.java index c288d10..a3ffd1f 100644 --- a/src/main/java/sbu/javafx/Launcher.java +++ b/src/main/java/sbu/javafx/Launcher.java @@ -4,5 +4,6 @@ import javafx.application.Application; public class Launcher{ public static void main(String[] args) { - // TODO: Launch the JavaFX application by calling Application.launch(Main.class) } + Application.launch(MusicApp.class); + } } diff --git a/src/main/java/sbu/javafx/MusicApp.java b/src/main/java/sbu/javafx/MusicApp.java index a50badc..cc7be6d 100644 --- a/src/main/java/sbu/javafx/MusicApp.java +++ b/src/main/java/sbu/javafx/MusicApp.java @@ -3,9 +3,11 @@ package sbu.javafx; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; +import javafx.scene.image.Image; import javafx.stage.Stage; import java.io.IOException; +import java.util.Objects; public class MusicApp extends Application { @@ -14,9 +16,13 @@ public class MusicApp extends Application { { FXMLLoader fxmlLoader = new FXMLLoader(MusicApp.class.getResource("App-view.fxml")); Scene scene = new Scene(fxmlLoader.load()); + + scene.getStylesheets().add(getClass().getResource("light.css").toExternalForm()); + stage.setTitle("Music Player"); stage.setScene(scene); - //TODO: add icon to the stage + + //stage.getIcons().add(new Image(Objects.requireNonNull(getClass().getResourceAsStream("/icon.png")))); stage.show(); } diff --git a/src/main/java/sbu/javafx/MusicController.java b/src/main/java/sbu/javafx/MusicController.java index 5da27a9..c90ff4d 100644 --- a/src/main/java/sbu/javafx/MusicController.java +++ b/src/main/java/sbu/javafx/MusicController.java @@ -2,30 +2,173 @@ package sbu.javafx; import javafx.fxml.FXML; import javafx.event.ActionEvent; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.input.MouseEvent; import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Objects; public class MusicController { + @FXML private Button mode; + @FXML private Button play1; + @FXML private Button play2; + @FXML private Button play3; + @FXML private Button addPl1; + @FXML private Button addPl2; + @FXML private Button addPl3; + @FXML private Label nowPlaying; - // TODO: Define your UI components using the @FXML annotation. - //TODO: Implement the logic to play a song. This method should update the UI to show which song is currently playing. + + + private ArrayList playList= new ArrayList(); + private Scene scene; + private boolean darkmode=false; + @FXML - public void handlePlayAction() { - //Update labels, change button icons, etc. + public void playsong1(){ + if(play1.getText().equals("Play")){ + play1.setText("Pasue"); + play2.setText("Play"); + play3.setText("Play"); + nowPlaying.setText("Now playing: Ey iran - Banan"); + }else { + play1.setText("Play"); + nowPlaying.setText("Now playing :"); + } + + } + + @FXML + public void playsong2(){ + if(play2.getText().equals("Play")){ + play2.setText("Pasue"); + play1.setText("Play"); + play3.setText("Play"); + nowPlaying.setText("Now playing: Mahe man - Ehsan Yasin"); + }else { + play2.setText("Play"); + nowPlaying.setText("Now playing :"); + } + + } + + @FXML + public void playsong3(){ + if(play3.getText().equals("Play")){ + play3.setText("Pasue"); + play1.setText("Play"); + play2.setText("Play"); + nowPlaying.setText("Now playing: Interstellar - Knoow"); + }else { + play3.setText("Play"); + nowPlaying.setText("Now playing :"); + } + } //TODO: Logic to add a specific song to the user's playlist. - public void addToPlaylist(String songName) { + public void addToPlaylist(ActionEvent event) { + Button clicked = (Button) event.getSource(); + String songcode = clicked.getText(); + + switch (songcode){ + case "ADD Music 1" :{ + playList.add("Ey iran -Banan"); + clicked.setText("Remove Music 1"); + break; + } + case "ADD Music 2":{ + playList.add("Mahe man - Ehsan Yassin"); + clicked.setText("Remove Music 2"); + break; + } + case "ADD Music 3":{ + playList.add("Interstellar - Knoow"); + clicked.setText("Remove Music 3"); + break; + } + case "Remove Music 1":{ + playList.remove("Ey iran -Banan"); + clicked.setText("ADD Music 1"); + break; + } + case "Remove Music 2":{ + playList.remove("Mahe man - Ehsan Yassin"); + clicked.setText("ADD Music 2"); + break; + } + case "Remove Music 3":{ + playList.remove("Interstellar - Knoow"); + clicked.setText("ADD Music 3"); + break; + } + + + + } + + + //Add the song to a list or update a ListView. } - // TODO:This method should open a new window or change the current scene to display the "Playlist" page. + private void showAlert(String message ) { + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setHeaderText(message); + alert.show(); + } - public void openPlaylistWindow() { + + public void openPlaylistWindow() throws IOException,NullPointerException { + + FXMLLoader fxmlLoader = new FXMLLoader(MusicController.class.getResource("Playlist-view.fxml")); + + scene = new Scene(fxmlLoader.load()); + if(darkmode){ + scene.getStylesheets().add(getClass().getResource("dark.css").toExternalForm()); + }else { + scene.getStylesheets().add(getClass().getResource("light.css").toExternalForm()); + } + PlaylistController plc = fxmlLoader.getController(); + plc.setPlaylist(playList); + Stage playlistStage = new Stage(); + playlistStage.setScene(scene); + + playlistStage.setTitle("Play list"); + playlistStage.show(); //Create a new stage and show the playlist UI. } + + + + + public void chagemode(){ + darkmode = !darkmode; + mode.getScene().getStylesheets().clear(); + if(darkmode){ + mode.getScene().getStylesheets().add(getClass().getResource("dark.css").toExternalForm()); + mode.setText("Swithch to light mode"); + } + else { + mode.getScene().getStylesheets().add(getClass().getResource("light.css").toExternalForm()); + mode.setText("Swithch to dark mode"); + + } + + + + + } + + } diff --git a/src/main/java/sbu/javafx/PlaylistController.java b/src/main/java/sbu/javafx/PlaylistController.java new file mode 100644 index 0000000..86e2c62 --- /dev/null +++ b/src/main/java/sbu/javafx/PlaylistController.java @@ -0,0 +1,39 @@ +package sbu.javafx; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; + +import java.util.ArrayList; + +public class PlaylistController { + + @FXML private Label PL1; + @FXML private Label PL2; + @FXML private Label PL3; + + + public void setPlaylist(ArrayList songs){ + + + PL1.setText(""); + PL2.setText(""); + PL3.setText(""); + + if (songs.size() > 0) PL1.setText(songs.get(0)); + if (songs.size() > 1) PL2.setText(songs.get(1)); + if (songs.size() > 2) PL3.setText(songs.get(2)); + + + + + } + + + + + + + + + +} diff --git a/src/main/resources/sbu/javafx/App-view.fxml b/src/main/resources/sbu/javafx/App-view.fxml index 306c8d3..09a8a94 100644 --- a/src/main/resources/sbu/javafx/App-view.fxml +++ b/src/main/resources/sbu/javafx/App-view.fxml @@ -1,8 +1,66 @@ - + + + + + + + + + + + +