From ef31487a0274ffe7aa50ba05696fdd33d717ed56 Mon Sep 17 00:00:00 2001 From: Mobina Date: Thu, 28 May 2026 16:44:10 +0330 Subject: [PATCH] adding buttons repeat and mute --- src/main/java/sbu/javafx/Main.java | 13 ++++- src/main/java/sbu/javafx/MusicController.java | 54 ++++++++++++++++-- src/main/java/sbu/javafx/Song.java | 5 ++ src/main/resources/image/forward.png | Bin 1470 -> 0 bytes src/main/resources/image/icons8-audio-64.png | Bin 0 -> 2159 bytes src/main/resources/image/icons8-end-64.png | Bin 0 -> 1382 bytes src/main/resources/image/icons8-mute-64.png | Bin 0 -> 1423 bytes .../image/icons8-skip-to-start-64.png | Bin 0 -> 1382 bytes .../resources/image/icons8-synchronize-64.png | Bin 0 -> 2083 bytes src/main/resources/image/rewind.png | Bin 1484 -> 0 bytes src/main/resources/sbu/javafx/App-view.fxml | 40 ++++++++++--- 11 files changed, 97 insertions(+), 15 deletions(-) delete mode 100644 src/main/resources/image/forward.png create mode 100644 src/main/resources/image/icons8-audio-64.png create mode 100644 src/main/resources/image/icons8-end-64.png create mode 100644 src/main/resources/image/icons8-mute-64.png create mode 100644 src/main/resources/image/icons8-skip-to-start-64.png create mode 100644 src/main/resources/image/icons8-synchronize-64.png delete mode 100644 src/main/resources/image/rewind.png diff --git a/src/main/java/sbu/javafx/Main.java b/src/main/java/sbu/javafx/Main.java index 1385424..d24e9e3 100644 --- a/src/main/java/sbu/javafx/Main.java +++ b/src/main/java/sbu/javafx/Main.java @@ -18,18 +18,27 @@ public class Main extends Application { controller.musicsListView.getItems().addAll( new Song("Blinding Lights", "The Weeknd"), new Song("Flowers", "Miley Cyrus"), - new Song("As It Was", "Harry Styles") + new Song("As It Was", "Harry Styles"), + new Song("Comme des enfants", "Coert De Pirate"), + new Song("Slow Down", "GRAE"), + new Song("Cigarettes out the window", "TV Girl"), + new Song("Shape of My Heart", "Sting"), + new Song("deja vu", "Olivia Rodirgo"), + new Song("Do It To It", "Acraze"), + new Song("Bones", "Imagine Dragons"), + new Song("Bunker", "Balthazar") ); controller.setupListView(controller.musicsListView); - Scene scene = new Scene(root, 600, 500); + Scene scene = new Scene(root, 500, 600); scene.getStylesheets().add( getClass().getResource("/css/light.css").toExternalForm() ); primaryStage.setTitle("Music Player"); primaryStage.setScene(scene); + primaryStage.setResizable(false); primaryStage.show(); } diff --git a/src/main/java/sbu/javafx/MusicController.java b/src/main/java/sbu/javafx/MusicController.java index b97a82c..86f3b72 100644 --- a/src/main/java/sbu/javafx/MusicController.java +++ b/src/main/java/sbu/javafx/MusicController.java @@ -1,18 +1,17 @@ package sbu.javafx; +import javafx.animation.PauseTransition; import javafx.fxml.FXML; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; +import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.scene.Scene; import javafx.scene.layout.VBox; +import javafx.util.Duration; public class MusicController { @@ -28,14 +27,21 @@ public class MusicController { @FXML Button playPauseBtn; @FXML + Button audioBtn; + @FXML Button openPlaylistBtn; @FXML Button themeToggleBtn; + @FXML + private Label messageLabel; private boolean isDarkMode=true; private boolean isPlaying=false; + private boolean isMute=false; private Song currentSong = null; ImageView playIcon; ImageView pauseIcon; + ImageView audioIcon; + ImageView muteIcon; // TODO: Define your UI components using the @FXML annotation. @@ -43,14 +49,22 @@ public class MusicController { public void initialize() { Image playImg = new Image(getClass().getResourceAsStream("/image/play.png")); Image pauseImg = new Image(getClass().getResourceAsStream("/image/pause.png")); + Image audioImg= new Image(getClass().getResourceAsStream("/image/icons8-audio-64.png")); + Image muteImg= new Image(getClass().getResourceAsStream("/image/icons8-mute-64.png")); playIcon = new ImageView(playImg); pauseIcon = new ImageView(pauseImg); + audioIcon= new ImageView(audioImg); + muteIcon= new ImageView(muteImg); playIcon.setFitWidth(35); playIcon.setFitHeight(35); pauseIcon.setFitWidth(35); pauseIcon.setFitHeight(35); + audioIcon.setFitWidth(35); + audioIcon.setFitHeight(35); + muteIcon.setFitWidth(35); + muteIcon.setFitHeight(35); playPauseBtn.setGraphic(playIcon); @@ -169,11 +183,32 @@ public class MusicController { } } + @FXML + public void mute(ActionEvent e){ + isMute=!isMute; + if(isMute){ + audioBtn.setGraphic(audioIcon); + }else{ + audioBtn.setGraphic(muteIcon); + } + } + //TODO: Logic to add a specific song to the user's playlist. public void addToPlaylist(ActionEvent event, Song song) { //Add the song to a list or update a ListView. playlistListView.getItems().add(song); + + messageLabel.setText("Added to playlist!"); + messageLabel.setVisible(true); + + PauseTransition pause = new PauseTransition(Duration.seconds(2)); + + pause.setOnFinished(e -> { + messageLabel.setVisible(false); + }); + + pause.play(); } // TODO:This method should open a new window or change the current scene to display the "Playlist" page. @@ -183,8 +218,15 @@ public class MusicController { musicsListView.setVisible(false); if(playlistListView!=null) playlistListView.setVisible(true); - else - throw new RuntimeException("Playlist is empty"); + + else{ + Alert alert = new Alert(Alert.AlertType.WARNING); + + alert.setTitle("Empty Playlist"); + alert.setHeaderText(null); + alert.setContentText("Playlist is empty!"); + alert.showAndWait(); + } } } diff --git a/src/main/java/sbu/javafx/Song.java b/src/main/java/sbu/javafx/Song.java index d24ae61..3cf0528 100644 --- a/src/main/java/sbu/javafx/Song.java +++ b/src/main/java/sbu/javafx/Song.java @@ -9,6 +9,11 @@ public class Song { this.singer=singer; } + @Override + public String toString() { + return " "; + } + public String getName() { return name; } diff --git a/src/main/resources/image/forward.png b/src/main/resources/image/forward.png deleted file mode 100644 index 2b0e588f65ec3d6844b50b2da135d1c1cacede36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1470 zcmV;v1ws0WP)He*whAAUpTgSfOUEk3@}$v|2w2 z)%Z%I=qHUa(KH18px+1~HZf_GJ+s)vfDsAWow-|UTMAp;E!0R;XiE_ka0{*3zIJ!a z+4lCayIuC)JNHrQFF8rKy?Z*p-=3K{bLOm~{10dGP}|q{su5aC7&NJjh6#sW!r-FH zXi{a6oim!m-{IeK&)~BWT8r;hRwFbW?k9|XsxtbU%4tUBR9LhOVQ^YybZ;d)xLNTt zv{>^xjnf9gX^#!UC5X60w9hr- z1qKOChicb}S9P`Cr84?uZUOU*yb%qMC7d1z>MiSCAz#T3ZdN(OJttmh{aYD*z)|vq zho2yfj{AUYQ6rq*)FPo8N62eB>>!LzdQI}y2Gc5|FUcj(pq_9@drz+1NPslq@PZuj zkx-4wVajV#Rw6-*(5GZ%bmQKWu^b6E0#VpxiF{CRSwEl3dQQZa2#ogOwryGf758}` z5RfAR>^DVT)1lfINscUIkPWc#wlYIsukdN2V>1e9AD&xo{pmAk^m?$)8N6AVe5`q$ ztEW1*qkz-%B~OqVrwv{Y(s2=3c;|`&s2omuJwO+%t0?&g+rsymb@p)dkk}RbNmNA- z*&bM>9?tpN-rnlC2t~_l1Z#LE9UZxRULY=|CdBT9Zfj62!~Hp5*QQhA!?V9SDgfbh zPqFZin|1WZL{cn8g%R^p+0Tuq6CLbyge|6Tra0#F%)s_h(xI7#K}WhgjD{8?0I#GR6u`jgv8$rK=SN!t7{LGC5G#L*m0So_ zMn~Ncz*yMAqvu3*-hOXZ07NF6%}ueIGNxET1aKHx8UZ)l62QQplmCkM679AGFmQc( zQhe0kX)*$6a_J&C>$U*KBDp&ewJm^wPk!$(!Khq&ifX~jIvM2y|e+ndL zrj~tTb_AH1oe`f8#Dr#b3aBnFf-B_)Rt2z{8{{v7y>1AA&%d%lc4$_Bk<_?&+fH_v zw+)7!6aYh1Rw6W&nLBIPJ%TS!gqSm_u$d4oHx+)a>w8Ja7S}R)s4AI6oFWXls z0sfv!i4P>#2m(Cx{DJ^g$6N1_eH^ZmbQ~_0HA+7YBdlD5DwX)6!AT__Dx-VNIy!uLaG@mj?tDgP)xH`&yHFA{oz|L-00vFcilRGX$E6iT z(bu+ixz(RyhFq0mAP)BU`MxZUz$Qc=4A4;{I(=CweKkfetl6tE1a@G0Jy54i)8Tbx zEnklZ%WbXIcxd}=)gXag=WXzaVg`iM13nnIB!hjX$Qw;kxnBL%Pd;I(NeY1p1Gb-f zPr{-xI!5$wHY#?Y>EXv#M~iI1CqEs~;YmdX0y=$h)wRm9P@S?yo293uH%l*@4i+oO zt{9_Z0S-aMNd%&>$&W3xxMSH~@Jw!z`+bruWpJP0cl1Sf>!g zvjd}V;7QB1aOW@>;Gx&*TU+l?{DPpaS6~w&VYJ&p@?ChI_x$^UWoD3j@b<+{{*Zew z`e4vx`HK%;V@n5Yz#2SWL=X<3avD=P9nO7udae|ong4lsUNFFC@jYAhmb<+kzjC|d YKj>9fBeOrwcf_G*e=KxA55TJ#&&<3G$2?#|X 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 m@>w}%9j|=U@A(@Ky8H{FtW%K@QQ{T=0000 +