Java (FX) во время воспроизведения одного звука, воспроизведения другого - PullRequest
0 голосов
/ 26 января 2020

У меня есть приложение FX, где с самого начала он начинает играть музыку c, и это работает. Теперь я хочу, чтобы при открытии метода для воспроизведения другого звука поверх него.

Я кодировал второй звук, как первый, но он не работает. Я пытался сделать новый Thread, но без изменений. Новый звук на самом деле играет как-то. Иногда это не играет вообще. Иногда целиком, а иногда всего за один се c.

Метод с новым звуком

    public void showFight(int fighterLeft, int fighterRight) throws InterruptedException {

        //Some code

        new Thread(() -> {
            music2();
        }).start();

        new Thread(() -> {
            try {
                Thread.sleep(3000L);
            } catch (InterruptedException e) {
            }
            Platform.runLater(() -> {
                //FadeIn();
                FightPane.setVisible(false);
            });
        }).start();

    }

    public static void music2() {
        Media hit2 = new Media(JavaFXApplicationStratego.class.getResource("/Sounds/fight.mp3").toString());
        MediaPlayer mediaPlayer2 = new MediaPlayer(hit2);
        mediaPlayer2.play();
    }

Первый звук

public static void music() {
        String bip = "/stopen.mp3";
        Media hit = new Media(JavaFXApplicationStratego.class.getResource("/Sounds/stopen.mp3").toString());
        MediaPlayer mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.play();
    }

1 Ответ

1 голос
/ 26 января 2020

Вы не поддерживаете строгую ссылку на MediaPlayer. Это означает, что экземпляр подходит для сборки мусора, как только возвращается вызов #music() (та же проблема с #music2()). Как только мусор будет собран, медиа перестанет играть. Поскольку циклы сборки мусора происходят не в заранее определенное время, а по мере необходимости, вы видите разное поведение в разных экземплярах вашего приложения. Исправление заключается в том, чтобы хранить экземпляры MediaPlayer там, где они будут сильно доступны, например, в поле вашего класса (при условии, что экземпляр вашего класса также сильно доступен).

Нет также причин, на основе того, что вы предоставили в своем вопросе, чтобы использовать темы. Воспроизведение музыки c в JavaFX уже асинхронно. А что касается выполнения действия в Потоке приложений JavaFX в более позднее время, то лучше использовать API анимации . Фоновая задача JavaFX periodi c Q & A показывает примеры этого. Например:

PauseTransition pt = new PauseTransition(Duration.seconds(3));
pt.setOnFinished(e -> FlightPane.setVisible(false));
pt.play();

Примечание: Предполагая, что FlightPane - это имя поля, которое в идеале должно называться flightPane. См. Java соглашения об именах .

...