ОШИБКА!Исключение в потоке "AWT-EventQueue-0" java.lang.IllegalStateException: не в потоке приложения FX;currentThread = AWT-EventQueue-0 - PullRequest
3 голосов
/ 03 апреля 2012

Я не уверен, что делаю не так.

Я создал таймер, который обновляет текстовую графику в верхней части моего графического интерфейса. Когда таймер истекает, он меняет переменную (которая связана с слушателем) и добавляет новый графический объект «Scene / Group / Node» в мой графический интерфейс.

-Изменение моей переменной // Связано с ChangeListener И добавление сцены в мой графический интерфейс // Не слушатель, но добавляет новые элементы в мой графический интерфейс

Оба эти дополнения вызывают сбой моей программы с этой ошибкой:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:235)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:393)

Пример кода ошибки:

int delay = new Integer(1000); //milliseconds
time_left=time_limit;


ActionListener taskPerformer = new ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent arg0) {
            // TODO Auto-generated method stub
            timer.setText(time_left+" SECONDS LEFT");


            time_left=time_left-1;
            if (time_left<0)
            {
                //time_left=time_limit;
                mytimer.stop();
                //mytimer.start();
            root.getChildren().get(2).setOpacity(.2);
            //root.getChildren().add(3,newScene());         //This causes to crash      //Adds a new Scene to my GUI
            current_player.setValue(false);         //Also causes to crash - current_player has a Listener on it
                //System.out.println("TIMER RAN OUT!");
            }


        }
};
mytimer=new Timer(delay, taskPerformer);
mytimer.start();

мой слушатель current_player:

current_player.addListener(new ChangeListener<Boolean>() {

            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
//Code in Here
}
{);

1 Ответ

1 голос
/ 03 апреля 2012

Не является ли сообщение об исключении очевидным.Вы используете Таймер Swing , который вызывает своего слушателя в потоке диспетчеризации событий (необходим при использовании приложений Swing).

Однако вы обновляете пользовательский интерфейс JavaFX в этом потоке, а не вПоток приложений FX.

Я (пока) не знаком с JavaFX, но, надеюсь, у них также есть такой механизм таймера, который вы можете использовать, или что-то похожее на EventQueue.invokeAndWait, которое вы могли бы использовать в actionPerformed method

Редактировать:

немного погуглил и нашел эту страницу о параллелизме в JavaFX , которая может быть хорошим чтением.Тем не менее, нет упоминания о классе таймера.Возможно, класс Animation - это то, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...