Java MusicPlay dans une instance différente


J'ai une classe principale avec un lecteur de musique. Il joue de la musique. Maintenant, je dois arrêter et Jouer de la musique dans une autre classe.

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){
    }

}

Alors maintenant, je le veux comme ceci: Si la musique joue et que je clique sur le bouton, la musique devrait arrêter de jouer. Et s'il ne joue pas la musique et que j'appuie sur le bouton, il devrait commencer à jouer la musique. J'espère que vous unserstand mon problème.

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;
        }
    }

}

Et je veux répéter la musique après la fin.

Espère que quelqu'un pourrait m'aider avec cette question!

EDIT: Voici comment j'ouvre "AnotherClass".

StackPane stockPane = FXMLLoader.load(Resource.onClassPath("AnotherClass.fxml").getURL());
root.getChildren().setAll(stockPane);

AnotherClass.java est la classe de contrôleur de AnotherClass.fxml.

Author: Zauvue, 2018-03-16

1 answers

Rendre votre lecteur statique pour ne pas l'instancier deux fois ou plus.

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) {
    }

}

Vous n'avez pas besoin de votre propre booléen pour basculer stop/play. Utilisez simplement le MediaPlayer.Statut. Implémentez également javafx.fxml.Initializable pour le premier test si de la musique est en cours de lecture.

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;
        }
    }
}

Je veux répéter la musique après la fin

Définissez le compte cyclique du MediaPlayer sur INDÉFINI.

mp3.setCycleCount(MediaPlayer.INDEFINITE);

Il commence à jouer de la musique, même s'il joue déjà. Donc, il joue plusieurs temps..

Je suppose que vous avez réussi à appeler root.getChildren().setAll(stockPane); plusieurs fois; ou il est appelé à nouveau chaque fois que quelque chose se produit (peut-être sur un bouton ou un clic d'onglet - votre application est-elle organisée en onglets?). Appeler cela plusieurs fois entraînera des boutons qui se chevauchent et de nouvelles instances du MediaPlayer qui ne jouent pas au moment de leur instanciation - donc un clic sur le bouton stop/play n'arrêtera pas l'ancien MediaPlayer, mais démarrera le nouveau.

 0
Author: Impulse The Fox, 2018-03-16 13:48:02