@devpy14

Из-за чего возникает ошибка Not on FX application thread?

Пишу mp3 проигрыватель. Xочу сделать так, чтобы когда заканчивалась песня, автоматом начинала играть следующая по списку. Есть метод "beginTimer()", который во время проигрывания песни считает время и в соответствии с ним двигает ползунок слайдера:

private void beginTimer() {
        timer = new Timer();

        mediaPlayer.setOnReady(() -> songDuration.setMax(media.getDuration().toSeconds()));

        timerTask = new TimerTask() {
            @Override
            public void run() {
                double current = mediaPlayer.getCurrentTime().toSeconds();
                double end = media.getDuration().toSeconds();

                running = true;
                songDuration.setValue((int) current);

                if (current / end == 1) {
                    cancelTimer();
                    nextMedia();
                }
            }
        };

        timer.scheduleAtFixedRate(timerTask, 0, 1000);
    }


Сама ошибка:
Exception in thread "Timer-2" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-2
	at javafx.graphics/com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:292)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:446)
	at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:474)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)
	at javafx.controls/javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:283)
	at javafx.controls/javafx.scene.control.skin.LabeledSkinBase.lambda$new$11(LabeledSkinBase.java:220)
	at javafx.controls/com.sun.javafx.scene.control.LambdaMultiplePropertyChangeListenerHandler.lambda$new$1(LambdaMultiplePropertyChangeListenerHandler.java:49)
	at javafx.base/javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:86)
	at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
	at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
	at javafx.base/javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:104)
	at javafx.base/javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:111)
	at javafx.base/javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:145)
	at javafx.base/javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:50)
	at javafx.base/javafx.beans.property.StringProperty.setValue(StringProperty.java:71)
	at javafx.controls/javafx.scene.control.Labeled.setText(Labeled.java:147)
	at main.Controller.setSongLabel(Controller.java:182)
	at main.Controller.nextMedia(Controller.java:105)
	at main.Controller$1.run(Controller.java:138)
	at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
	at java.base/java.util.TimerThread.run(Timer.java:506)


Метод "nextMedia()":
public void nextMedia() {
        if (songCounter < playList.size() - 1) songCounter++;
        else songCounter = 0;

        mediaPlayer.stop();

        if (running) cancelTimer();

        setMediaPlayer();
        setSongLabel();
        playMedia();
    }


Ошибка возникает именно на строчке songLabel.setText(fileName.substring(0, fileName.length() - 4));
Сам метод "setSongLabel":

private void setSongLabel() {
        String fileName = playList.get(songCounter).getName();

        songLabel.setText(fileName.substring(0, fileName.length() - 4));
    }
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Практически у любой UI системы есть свой тред, на котором надо осуществлять доступ к элементам UI. Очевидно, здесь нужно перенести выполнение обратно на FX application thread.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 15:11
50000 руб./за проект
29 мар. 2024, в 15:06
50000 руб./за проект