JavaFX Media-Loop - PullRequest
       6

JavaFX Media-Loop

0 голосов
/ 26 августа 2018

У меня есть следующий код, который создает MediaPlayer и воспроизводит аудио:

public void playSong(Songs song) {
    this.media = new Media(getClass().getResource("/sounds/login_song.wav").toString());
    this.soundPlayer = new MediaPlayer(media);
    this.soundPlayer.setVolume(this.currentVolume);
    this.soundPlayer.setAutoPlay(true);
    this.soundPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    this.soundPlayer.play();
}

для создания аудио-петли я использовал:

this.soundPlayer.setAutoPlay(true);
this.soundPlayer.setCycleCount(MediaPlayer.INDEFINITE);

Это работает, когда я запускаю приложение из IDE. Я использую: Eclipse Oxygen.3a Release (4.7.3a).

Когда я экспортирую свое приложение в исполняемый JAR-файл, звук воспроизводится только один раз и не зацикливается. Запуск Jar из терминала не помогает, так как никаких ошибок не возникает (java -jar MyApplication.jar).

Почему аудио не зацикливается?

1 Ответ

0 голосов
/ 26 августа 2018

Я попробовал ваш код, и он хорошо работал как из IDE, так и из jar, но у меня есть хак для вас, если вы хотите использовать бесконечный цикл с использованием метода setOnEndOfMedia (), подобного этому

UPDATE:

не идеальное решение, но воссоздание медиа-плеера в onEndOfMedia каким-то образом решит эту проблему (я попытался использовать блок catch, чтобы получить визуальные исключения во время тестирования из jar-файла)

MediaPlayer mp;
Media m = null;

@Override
public void start(Stage ps) throws Exception {
    try {
        m = new Media(getClass().getResource("/play.wav").toString());
        mp = new MediaPlayer(m);
        Runnable onEnd = new Runnable() {
            @Override
            public void run() {
                mp.dispose();
                mp = new MediaPlayer(m);
                mp.play();
                mp.setOnEndOfMedia(this);
            }
        };
        mp.setOnEndOfMedia(onEnd);
        mp.play();
        ps.show();
    } catch (Exception ex) {
        Alert al = new Alert(AlertType.ERROR);
        al.setContentText(ex.getMessage());
        al.showAndWait();
    }
}
...