2016-03-14 3 views
1

я хочу изменить пользовательский интерфейс в других потоках и пытался этоКак изменить пользовательский интерфейс из других потоков

ПУТИ
SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      try { 
       Thread.sleep(5000); 
       lblToast.setText(6+""); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(FXMLDocumentController.class.getName()) 
                .log(Level.SEVERE, null, ex); 
      } 
     } 
}); 

Но этот код не работает.

+1

Сделайте это более конкретно, что не работает? Какую ошибку вы получаете? и добавить некоторые коды –

+0

ск ответ здесь http://stackoverflow.com/questions/35980899/how-to-can-change-ui-in-other-threads/35982468#35982468 –

ответ

2

ScheduledExecutorService.schedule() позволяет выполнить задачу после указанной задержки. Platform.runLater() выполняет Runnable на JavaFX-Thread.

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor(); 
Runnable setLabelOnUI =() -> Platform.runLater(() -> lblToast.setText(6+"")); 
ex.schedule(setLabelOnUI, 5000, TimeUnit.MILLISECONDS); 
+0

После определенного времени – saman1046

+0

@ saman1046 Я обновил свой ответ, чтобы указать задержку перед исполнением. – Spotted

-2

Редактировать: Убедитесь, что переменная метки является статической, поэтому Runnable Thread может получить к ней доступ! Heres синтаксис:

Runnable displayRunnable = new Runnable(){ 
         @Override 
         public void run(){ 
         //Enter Code to Change UI here! 

         } 
}; 
//Display Runnable allows us to modify UI components 
Display.getDefault().syncExec(displayRunnable); 
+0

Если у вас есть незаконное исключение потока, вызывается Display.getDefault(). SyncExec (Runnable r); это путь. Я считаю, что ваш вопрос касался вставки таймера. Просто вставьте блок кода таймера внутри прогона функции. –

+3

Что такое класс отображения? – saman1046

3

Основное средство для запуска что-то на потоке приложения JavaFX является Platform.runLater(). Тем не менее, по вашим комментариям, вы, похоже, также хотите запустить что-то в потоке приложений JavaFX после задержки, так что это ответ на этот ответ.


ниже код будет планировать что-то делать на потоке приложения JavaFX после 5 секундной задержки:

Platform.runLater(() -> { 
    PauseTransition pause = new PauseTransition(Duration.seconds(5)); 
    pause.setOnFinished(event -> doSomething()); 
    pause.play(); 
}); 

В вашем случае, йоЗотеЬЫпд() является:

lblToast.setText(6+""); 

Это аналогичен решению:

A (второстепенный) преимущество PauseTransition над использованием ScheduledExecutorService является то, что переход не требует дополнительного потока. Недостатком является то, что ScheduledExecutorService возвращает ScheduledFuture, который может дать вам немного больше контроля над процессом, поскольку вы можете вызывать такие методы, как cancel() или isDone() в ScheduledFuture (этот дополнительный контроль может быть не очень важен для вашего приложения).

+0

@ saman1046 jewelsea прав о преимуществах его решения. Кроме того, я подозреваю, что вам не нужен контроль, предоставляемый «ScheduledFuture», как в моем решении, поэтому просто придерживайтесь его решения (что проще). :-) – Spotted

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