Сцена переключения глюона на пользовательском событии - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь переключить сцену приложения Gluon, когда запускается пользовательское событие.

Когда я звоню

MobileApplication.getInstance().switchView(SECONDARY_VIEW);"

Я получаю ошибку

Исключение в потоке "Thread-6" java.lang.IllegalStateException: эта операция разрешена только в потоке событий;currentThread = Thread-6


Это слушатель, который обрабатывает пользовательское событие

ParallelServerInterface.setLoginResponseListener(new LoginResponseListener() {
        @Override
        public void loginResponseReceived(LoginResponse loginResponse) {
            Map<String, String> source = (Map<String, String>) loginResponse.getSource();
            boolean status = source.get("status").equals("true");

            if (status) {
                MobileApplication.getInstance().switchView(SECONDARY_VIEW);
            }
        }
    });

Как это можно решить?

1 Ответ

2 голосов
/ 20 октября 2019

Любой вызов MobileApplication.getInstance()::switchView должен происходить в потоке приложения JavaFX, так как он в основном включает изменения в графе сцены.

Грубо говоря, вы удаляете старый вид (который является Node) и добавляете новый (другой Node):

glassPane.getChildren().remove(oldNode);
glassPane.getChildren().add(newNode);

И, как вы знаете, что-нибудьсвязанные с манипулированием узлами должны выполняться в потоке приложения JavaFX.

Кажется, что событие входа в систему запускается в фоновом потоке, поэтому все, что вам нужно сделать, это поставить переключатель представления в очередь в потоке приложения, используяPlatform.runLater:

    @Override
    public void loginResponseReceived(LoginResponse loginResponse) {
        Map<String, String> source = (Map<String, String>) loginResponse.getSource();
        boolean status = source.get("status").equals("true");

        if (status) {
            // switch view has to be done in the JavaFX Application thread:
            Platform.runLater(() ->
                MobileApplication.getInstance().switchView(SECONDARY_VIEW));
        }
    }
...