2015-04-29 3 views
0

У меня есть приложение java fx со многими табличными представлениями. Как мы знаем в javafx tableview, есть привязка данных, которая работает в двух направлениях. Поэтому, когда мое приложение делает вычисления с моими данными из пользовательского интерфейса tableviws, оно замерзает, потому что мое приложение постоянно обновляет данные из табличных представлений (ObservableList). Я пытался использовать Platform.RunLater, но мне это не помогло. Есть идеи?UI зависание при выполнении некоторых вычислений

+1

использование AsyncTask или нить .. –

+0

Попробуйте запустите свои обновления в отдельном потоке: http://stackoverflow.com/questions/28453344/how-to-update-tableview-items-outside-javafx-thread – Tomek

+0

Это также может помочь: http://stackoverflow.com/questions/11690683/javafx-update-ui-from-another-thread –

ответ

1

Platform.runLater По существу задерживает ваш runnable - но он все же снова запускается на UI-потоке, поэтому блокирует каждый пользовательский ввод во время выполнения.

Решение очень простое, use a worker thread:

Task task = new Task<Void>() { 
    @Override public Void call() { 
     static final int max = 1000000; 
     for (int i=1; i<=max; i++) { 
      if (isCancelled()) { 
       break; 
      } 
      updateProgress(i, max); 
     } 
     return null; 
    } 
}; 
ProgressBar bar = new ProgressBar(); 
bar.progressProperty().bind(task.progressProperty()); 
new Thread(task).start(); 

Хотя рекомендуется использовать ExecutorService класс, так как она позволяет более контролируемым поведением: http://java-buddy.blogspot.de/2012/06/example-of-using-executorservice.html

+0

As i unders tand, ваш пример будет работать, если я хочу периодически обновлять свой пользовательский интерфейс, и количество этих обновлений будет ограничено. Но я хочу обновить свой интерфейс при выполнении моих вычислений. UPD: Спасибо! Это действительно работает! –

+0

нет проблем - вы можете запустить свою задачу навсегда, если это требование, нет ограничений на время выполнения, это просто пример. Если вы натыкаетесь на исключения «Не на FX-приложении», решение также довольно просто: заверните вызов функции нарушения (_nothing else! _) В 'Platform.runLater' – specializt

+1

' Platform.runLater (...) 'не обязательно задерживать выполняемое в любом наблюдаемом смысле; на самом деле, если ваше приложение хорошо структурировано, оно будет работать с помощью следующего кадра визуализации пользовательского интерфейса. Имя метода просто указывает, что вызов является асинхронным, поэтому выполнение кода будет продолжаться после вызова 'Platform.runLater (...)', но до того, как runnable, вероятно, закончит. –

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