Пожалуйста, потерпите меня, так как это будет довольно подробное и конкретное требование.Я также рассмотрел многочисленные вопросы, уже перечисленные в 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
}
}
У меня есть три проблемы с этим подходом.
- Если я нене используйте Platform.runLater () для оповещения Windows и входа в систему Windows, тогда я получаю сообщение об ошибке Нет в потоке приложения FX;currentThread = Ошибка потока приложения JavaFX?
- Если я использую Platform.runLater (), тогда, даже если окно входа в систему активно, остальные окна предупреждений также отображаются немедленно, не дожидаясь чтения учетных данных входа в систему.
- Если я вручную создаю файл для хранения текущих учетных данных, то любое окно предупреждения, которое у меня появляется, появляется дважды.
Дайте мне знать, если вам нужна дополнительная информация.Заранее спасибо.
РЕДАКТИРОВАТЬ-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 все еще возникает, теперь отображаются два окна входа в систему.
Спасибо.