2016-06-13 3 views
0

Привет У меня есть приложение, которое работает как на графическом интерфейсе (Java FX), так и на командной строке. Когда вы выполняете GUI, я показываю статус в текстовой области. Это прекрасно работает.Java FX: невозможно открыть всплывающее окно из разных потоков FX

Но проблема в том, когда я пытаюсь показать ошибку (через всплывающее окно) из какого-то другого (не javafx) класса, это показывает мне Java Fx - thread Exception not on FX thread.

Ниже мой код

Это мой Java класс FX, где я хочу, чтобы показать всплывающее окно.

public class DeploymentProcesController implements Initializable { 


@FXML 
private TextArea statusTextArea; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 

} 

public void updateGUIMessage(String message) { 
    if (Platform.isFxApplicationThread()) { 
     statusTextArea.appendText(message); 
    } else { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       statusTextArea.appendText(message); 
      } 
     }); 
    } 
} 

public void displayAlertMessages(final String message) { 
    Platform.setImplicitExit(false); 
    Task<Void> task = new Task<Void>() { 
     @Override public Void call() { 
      Platform.runLater(new Runnable() { 
       public void run() { 
        Alert alert = new Alert(AlertType.INFORMATION, message, ButtonType.OK); 
        alert.showAndWait(); 
       } 
      }); 

      return null; 
     } 
    }; 
    new Thread(task).start(); 
} 

}

я иметь не класс FX, который является точкой входа. Итак, исходя из типа запуска (командной строки/GUI), я обновляю статус.

Вот как я звоню, чтобы обновить статус.

public void promptUser(String message,boolean isCommandLineRun){ 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    if(isCommandLineRun) { 
     System.out.println(simpleDateFormat.format(new Date()) + " - " + message); 
    } else { 
     controller.displayAlertMessages(message); 
    } 
} 

У меня нет проблем, когда я вызываю метод updateGUIMessage из класса non fx. Это связано с тем, что элемент statusArea находится в потоке FX (член этого класса fx).

Также у меня нет проблем с созданием окна предупреждения на какой-либо кнопке, , но для отображения окна предупреждения из другого класса. У меня возникают проблемы, поскольку, как только я пытаюсь создать окно предупреждения, приложение вылетает , говоря не о потоке fx.

Я понимаю, что поле «Предупреждение» является всплывающим окном и поэтому может быть необработанным. Но кто-нибудь может мне помочь, я хочу показать пользователю окно предупреждения из разных классов.

+0

Любой класс волен называть любой класс JavaFX или метод, но этот вызов должен быть сделан на FX нить Java, независимо от того, какой класс не делает вызов. Если вы не хотите, чтобы какой-либо конкретный класс импортировал платформу, напишите метод в другом классе, который использует Platform.runLater, и вызовите этот метод «non fx». – VGR

ответ

0

Наконец нашел решение этого,

Поскольку Java FX работает на одном потоке, все должно быть в той же теме. Для каждой задачи (например, всплывающего окна), где требуется фон для паузы, нам нужно использовать FutureTask.

Я нашел эту статью, здесь:

JavaFX2: Can I pause a background Task/Service?

1

Все в пользовательском интерфейсе должно выполняться из потока приложений пользовательского интерфейса. Это именно то, что означает сообщение об ошибке.

К счастью, вы можете просто обернуть вызов так, что она выполняется в потоке пользовательского интерфейса:

if(isCommandLineRun) { 
    System.out.println(simpleDateFormat.format(new Date()) + " - " + message); 
} else { 
    Platform.runLater(() -> controller.displayAlertMessages(message)); 
} 
+0

Не работает, Прежде всего, метод promptUser находится в классе NON Java FX, поэтому мне нужно импортировать платформу (которой я не хочу - намереваться поддерживать классы JavaFX в отдельном классе). Также после попытки этого приложения приложение аварийно завершает работу и не отображает всплывающее окно. Исключение: java.lang.IllegalStateException: Не применяется к потоку приложения FX; currentThread = Thread-6 –

+0

Также платформа.runLater shoud будет использоваться для небольших операций, Я хочу отобразить окно предупреждения, в котором я буду использовать showaAndWait(), поэтому использование Platform.runLater не рекомендуется –

+0

При вызове метода 'controller.displayAlertMessages' обновление должно произойти в потоке пользовательского интерфейса. Таким образом, вы можете переместить вызов 'Platform.runLater' на другую сторону и только обернуть ту часть кода, которая фактически обновляет пользовательский интерфейс. – hotzst

Смежные вопросы