Java 不同实例中的 MusicPlay
Java MusicPlay in different Instance
我有一个带有 MusicPlayer 的 Main Class。它播放音乐。现在我需要在另一个 class.
中停止并播放音乐
public class Main{
public final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
public final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );
public static void main(String[] args){
}
}
所以现在,我想要这样:如果音乐正在播放并且我单击按钮,音乐应该停止播放。如果它不播放音乐而我按下按钮,它应该会开始播放音乐。希望您能理解我的问题。
public class AnotherClass{
Main mp3 = new Main();
boolean clicked = true;
public void musicButtonClicked(ActionEvent e){
if(clicked){
mp3.mediaPlayer.stop(); //Stop doesn't work!
clicked = false;
}else{
mp3.mediaPlayer.play(); //It starts to play the music, even if it is already playing. So it plays multiple times..
clicked = true;
}
}
}
我想在音乐结束后重复播放。
希望有人能帮我解决这个问题!
编辑:这就是我打开 "AnotherClass".
的方式
StackPane stockPane = FXMLLoader.load(Resource.onClassPath("AnotherClass.fxml").getURL());
root.getChildren().setAll(stockPane);
AnotherClass.java
是 AnotherClass.fxml
的控制器-Class。
让您的 Player 保持静态,不要实例化它两次或更多次。
public class Main {
public static final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
public static final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );
public static void main(String[] args) {
}
}
您不需要自己的布尔值来切换 stop/play。只需使用 MediaPlayer.Status。如果正在播放音乐,还实施 javafx.fxml.Initializable
进行第一次测试。
public class AnotherClass implements Initializable {
private static boolean firstTime = true;
MediaPlayer mp3 = Main.mediaPlayer;
@FXML
private Button musicButton;
@Override
public void initialize(URL location, ResourceBundle resources)
{
if (firstTime)
{
mp3.statusProperty().addListener((o, oldVal, newVal) -> updateButton(newVal));
firstTime = false;
}
updateButton(mp3.getStatus());
}
@FXML
public void musicButtonClicked(ActionEvent e) throws IOException {
switch(mp3.getStatus()) {
case PLAYING:
mp3.stop();
break;
default:
mp3.play();
break;
}
}
private void updateButton(MediaPlayer.Status status)
{
switch(status) {
case PLAYING:
this.musicButton.setText("Stop Music");
break;
default:
this.musicButton.setText("Play Music");
break;
}
}
}
I want to repeat the music after it finished
将 MediaPlayer 的 CycleCount 设置为 INDEFINITE。
mp3.setCycleCount(MediaPlayer.INDEFINITE);
It starts to play the music, even if it is already playing. So it plays multiple times..
我的猜测是您以某种方式设法多次调用 root.getChildren().setAll(stockPane);
;或者它会在每次发生某些事情时再次调用(可能是在按钮或选项卡上单击 - 您的应用程序是否组织在选项卡中?)。多次调用此方法将导致按钮重叠和 MediaPlayer 的新实例在实例化时不播放 - 因此单击 stop/play 按钮不会停止旧的 MediaPlayer,但会启动新的 MediaPlayer .
我有一个带有 MusicPlayer 的 Main Class。它播放音乐。现在我需要在另一个 class.
中停止并播放音乐public class Main{
public final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
public final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );
public static void main(String[] args){
}
}
所以现在,我想要这样:如果音乐正在播放并且我单击按钮,音乐应该停止播放。如果它不播放音乐而我按下按钮,它应该会开始播放音乐。希望您能理解我的问题。
public class AnotherClass{
Main mp3 = new Main();
boolean clicked = true;
public void musicButtonClicked(ActionEvent e){
if(clicked){
mp3.mediaPlayer.stop(); //Stop doesn't work!
clicked = false;
}else{
mp3.mediaPlayer.play(); //It starts to play the music, even if it is already playing. So it plays multiple times..
clicked = true;
}
}
}
我想在音乐结束后重复播放。
希望有人能帮我解决这个问题!
编辑:这就是我打开 "AnotherClass".
的方式StackPane stockPane = FXMLLoader.load(Resource.onClassPath("AnotherClass.fxml").getURL());
root.getChildren().setAll(stockPane);
AnotherClass.java
是 AnotherClass.fxml
的控制器-Class。
让您的 Player 保持静态,不要实例化它两次或更多次。
public class Main {
public static final Media musicMedia = new Media(new File("music.mp3").toURI().toString());
public static final MediaPlayer mediaPlayer = new MediaPlayer(musicMedia );
public static void main(String[] args) {
}
}
您不需要自己的布尔值来切换 stop/play。只需使用 MediaPlayer.Status。如果正在播放音乐,还实施 javafx.fxml.Initializable
进行第一次测试。
public class AnotherClass implements Initializable {
private static boolean firstTime = true;
MediaPlayer mp3 = Main.mediaPlayer;
@FXML
private Button musicButton;
@Override
public void initialize(URL location, ResourceBundle resources)
{
if (firstTime)
{
mp3.statusProperty().addListener((o, oldVal, newVal) -> updateButton(newVal));
firstTime = false;
}
updateButton(mp3.getStatus());
}
@FXML
public void musicButtonClicked(ActionEvent e) throws IOException {
switch(mp3.getStatus()) {
case PLAYING:
mp3.stop();
break;
default:
mp3.play();
break;
}
}
private void updateButton(MediaPlayer.Status status)
{
switch(status) {
case PLAYING:
this.musicButton.setText("Stop Music");
break;
default:
this.musicButton.setText("Play Music");
break;
}
}
}
I want to repeat the music after it finished
将 MediaPlayer 的 CycleCount 设置为 INDEFINITE。
mp3.setCycleCount(MediaPlayer.INDEFINITE);
It starts to play the music, even if it is already playing. So it plays multiple times..
我的猜测是您以某种方式设法多次调用 root.getChildren().setAll(stockPane);
;或者它会在每次发生某些事情时再次调用(可能是在按钮或选项卡上单击 - 您的应用程序是否组织在选项卡中?)。多次调用此方法将导致按钮重叠和 MediaPlayer 的新实例在实例化时不播放 - 因此单击 stop/play 按钮不会停止旧的 MediaPlayer,但会启动新的 MediaPlayer .