Вы не поддерживаете строгую ссылку на 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 соглашения об именах .