Java FX 8 с использованием Platform.runLater () в методе Application init () для отображения полей оповещения / входа - PullRequest
0 голосов
/ 18 марта 2019

Пожалуйста, потерпите меня, так как это будет довольно подробное и конкретное требование.Я также рассмотрел многочисленные вопросы, уже перечисленные в stackoverflow относительно использования Platform.runLater ().Но я не смог найти подходящий ответ.Если кто-то сможет определить правильный вопрос и пометить его как дубликат, я все равно буду полон.Также я новичок в программировании на JavaFX, поэтому, если мне нужно изменить архитектуру, пожалуйста, дайте мне знать.

Я создаю отдельное приложение JavaFX для запуска некоторых модульных тестов на основе пользовательскихтребования.Перед запуском реальных тестов мне нужно убедиться, что конечный пользователь использует тест с последними доступными библиотеками, сравнивая файлы манифеста из удаленного репозитория Artifactory и файлы манифеста из jars на текущем пути к классам.Я хочу сохранить учетные данные для Artifactory, чтобы я мог использовать их для последующих выполнений.Если номера сборки из удаленного и локального манифеста не совпадают, я хочу отобразить окно с предупреждением об ошибке, информирующее пользователя.Я хочу использовать предварительный загрузчик для отображения gif и соответствующих сообщений на каждом из этих шагов.

public class UI extends Application 
{
    String username=null, password=null;
    Manifest remoteManifest, localManifest;

    @Override
    public void init() {

        notifyPreloader("Loading Stored Credentials");
        loadStoredCredentials();

        if(username == null && password == null) {
            notifyPreloader("Requesting New Credentials");
            getNewCredentials();
        }

        notifyPreloader("Reading remote manifest");
        readRemoteManifest();

        notifyPreloader("Reading local manifest");
        readLocalManifest();

        notifyPreloader("Comparing manifests");
        compareManifests();

    }

    private void getNewCredentials() {
        Platform.runLater(new Runnable() {
            public void run() {
                // Login window for new credentials
                //Save credentials
            }
        });
    }

    private void readRemoteManifest() {
        // REST API call to read remote manifest
        if(HttpStatus.SC_UNAUTHORIZED) { // Stored credentials might have been read the first time which are expired, so try again.
            getNewCredentials();
            readRemoteManifest();
        } else {
            // update remote manifest object
        }
    }

    private void readLocalManifest() {
        // Update local manifest object
    }

    private void showAlert() {
        Platform.runLater( new Runnable() {
            // Display Alert window
        });
    }

    private void compareManifests() {
        if(remoteManifest == null) {
            showAlert();
        }

        if(localAlert == null) {
            showAlert();
        }

        if(remoteBuildNumber != localBuildNumber) {
            showAlert();
        }
    }

    @Override
    public void start(Stage primaryStage){
        //UI to select options and run tests
    }
}

У меня есть три проблемы с этим подходом.

  1. Если я нене используйте Platform.runLater () для оповещения Windows и входа в систему Windows, тогда я получаю сообщение об ошибке Нет в потоке приложения FX;currentThread = Ошибка потока приложения JavaFX?
  2. Если я использую Platform.runLater (), тогда, даже если окно входа в систему активно, остальные окна предупреждений также отображаются немедленно, не дожидаясь чтения учетных данных входа в систему.
  3. Если я вручную создаю файл для хранения текущих учетных данных, то любое окно предупреждения, которое у меня появляется, появляется дважды.

Дайте мне знать, если вам нужна дополнительная информация.Заранее спасибо.

РЕДАКТИРОВАТЬ-1:

Кто-то дал мне ответ, чтобы исправить первые две проблемы.Но сейчас ответ отсутствует.Если они могут повторно опубликовать ответ, это будет полезно для других.

Решением было переместить код Platform.runLater () в метод compareManifests () из метода showAlert ().Вместо этого я переместил Platform.runLater () в метод init ().Теперь у меня есть только один вызов runLater ().

Модифицированный код для устранения первых двух проблем.

public class UI extends Application 
{
    String username=null, password=null;
    Manifest remoteManifest, localManifest;

    @Override
    public void init() {
        Platform.runLater( new Runnable() {
            public void run() {
                notifyPreloader("Loading Stored Credentials");
                loadStoredCredentials();

                if(username == null && password == null) {
                    notifyPreloader("Requesting New Credentials");
                    getNewCredentials();
                }

                notifyPreloader("Reading remote manifest");
                readRemoteManifest();

                notifyPreloader("Reading local manifest");
                readLocalManifest();

                notifyPreloader("Comparing manifests");
                compareManifests();
            }
        });
    }

    private void getNewCredentials() {
        // Login window for new credentials
        //Save credentials
    }

    private void readRemoteManifest() {
        // REST API call to read remote manifest
        if(HttpStatus.SC_UNAUTHORIZED) { // Stored credentials might have been read the first time which are expired, so try again.
            getNewCredentials();
            readRemoteManifest();
        } else {
            // update remote manifest object
        }
    }

    private void readLocalManifest() {
        // Update local manifest object
    }

    private void showAlert() {
        // Display Alert window
    }

    private void compareManifests() {

        if(remoteManifest == null) {
            showAlert();
        }

        if(localAlert == null) {
            showAlert();
        }

        if(remoteBuildNumber != localBuildNumber) {
            showAlert();
        }
    }

    private void loadStoredCredentials() {
        // Read the credentials from a local file
    }

    @Override
    public void start(Stage primaryStage){
        //UI to select options and run tests
    }
}

Проблема 3 все еще возникает, теперь отображаются два окна входа в систему.

Спасибо.

...