2012-05-21 3 views
0

Я хочу выполнить пакет задач (обновления для графического интерфейса) и запускать их каждую секунду. (У меня есть сотни обновлений в секунду и его причиной Java FX 2 замерзать)Задачи дозирования с помощью Executor

public void update(String price){ 
     Platform.runLater(new Runnable(){ 
      @Override 
      public void run() { 
       priceLabel.setText(price); 

      }}); 
    } 

Что самый простой способ сделать это в Java?

ответ

2

Ну, как правило, все обновления для графического интерфейса объединены и обрабатываются в потоке графического интерфейса пользователя. Я думаю, что ваша архитектура - ваша настоящая проблема. Не стоит менять метки каждые 10 мс. Даже если Java FX будет поддерживать это, единственное, что пользователь увидит, мерцает. Поэтому я рекомендую вам обновить свою внутреннюю модель данных и сделать изменения вашей модели данных видимыми для пользователя с определенным временным интервалом. Ваша модель данных не зависит от вашего пользовательского интерфейса, и фоновый поток может отправить одно обновление в ваш интерфейс пользователя каждые 2 секунды или около того.

0

Что вызывает изменение? Если текст связан с некоторым значением объекта, you could use binding, чтобы получить автоматическое обновление GUI при изменении значения объекта.

В качестве альтернативы вы можете попробовать сделать это вручную. См. Приведенный ниже код (упрощенно - вам, вероятно, необходимо очистить список при запуске runnables, чтобы избежать их запуска дважды - в этом случае вам нужно иметь дело с проблемами параллелизма и т. Д.):

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
final List<Runnable> list = new CopyOnWriteArrayList<Runnable>(); //your updates 
Runnable updateGui = new Runnable() { 

    @Override 
    public void run() { 
     Platform.runLater(new Runnable() { 

      @Override 
      public void run() { 
       for (Runnable r : list) { 
        r.run(); 
       } 
      } 
     }); 
    } 
}; 

scheduler.scheduleAtFixedRate(updateGui, 0, 1, TimeUnit.SECONDS); 

list.add(new Runnable() { 

    @Override 
    public void run() { 
     priceLabel.setText(price); 
    } 
}); 
Смежные вопросы