2017-02-10 7 views
0

Есть ли возможность показать индикатор хода (вращение, не застревание), пока какой-то тяжелый подъем делается в javafx ui thread?Показать ProgressIndicator во время тяжелой работы в потоке графического интерфейса должно быть сделано

Backstory: Ive получил для загрузки довольно большой таблицыView в TitledPane (который занимает несколько секунд). Команда, которая делает все это отставание, - TitledPane.setContent (myTableView). Так что я хочу хотя бы показать анимацию или индикатор загрузки за это время.

Так прямо сейчас я делаю следующее, чтобы дать Ui нить достаточно места для дыхания, чтобы показать свою загрузку анимации, прежде чем делать дорогой звонок:

showMyLoadingAnimation(); 
PauseTransition pause = new PauseTransition(Duration.seconds(1)); 
pause.setOnFinished(event -> { 
    setContent(myTableView); 
}); 
pause.play(); 
dismissMyLoadingAnimation(); 

это работает получить индикатор выполнения, показанный, но как только Нить ui начинает работать над setContent, и он застревает.

ive видел, как некоторые люди используют качели, чтобы отобразить простоя или диалог с анимацией, чтобы она работала в другом потоке и не застревала, но пока не смогла найти убедительное решение.

EDIT: Хорошо, я нашел этот корень проблемы. , так что ive получил таблицы prefHeightProperty, связанные с размером списка, отображаемым здесь: JavaFX - Adapt TableView height to number of rows сделал это несколько недель назад, работал, забыл об этом.

, который стоит много времени. поэтому, хотя время вызова при настройке привязки не показывает, что это занимает много времени, поток ui, похоже, имеет огромную проблему с ним, когда таблицы становятся большими.

спасибо james, его ответ будет правильным для большинства людей, сталкивающихся с такой проблемой.

может кто-то пожалуйста прокомментируйте этот вопрос там: JavaFX - Adapt TableView height to number of rows (так как это первый вопрос я не хватает респ еще комментариев.)

+0

'titledPane.setContent (myTableView),' не может быть реально принимать какие-либо заметного времени. Что-то еще, что происходит в коде, занимает время; возможно, загружая данные. Вы должны перенести трудоемкую работу (которая не является действительной работой пользовательского интерфейса) на фоновый поток. –

ответ

1

Загрузить данные в Task, работает в фоновом потоке. Отобразите анимацию загрузки (или ProgressIndicator и т. Д.) При запуске задачи и удалите ее, когда задача завершится.

Основная идея выглядит следующим образом:

TableView<MyDataType> table = new TableView<>(); 
// set up columns... 

Task<List<MyDataType>> loadDataTask = new Task<List<MyDataType>>() { 
    @Override 
    protected List<MyDataType> call() throws Exception { 
     List<MyDataType> data = ... ; 
     // load data and populate list ... 
     return data ; 
    } 
}; 
loadDataTask.setOnSucceeded(e -> table.getItems().setAll(loadDataTask.getValue())); 
loadDataTask.setOnFailed(e -> { /* handle errors... */ }); 

ProgressIndicator progressIndicator = new ProgressIndicator(); 
table.setPlaceHolder(progressIndicator); 

Thread loadDataThread = new Thread(loadDataTask); 
loadDataThread.start(); 
+0

привет! ive уже там. но я попробовал снова с вашим кодом, но безрезультатно. Подготовка данных не является большой проблемой, ее уже там, ive обнаружил, что table.getItems(). Set ... does not занимает так долго в целом. теперь после того, как я рылся глубже, я нашел виновника этого беспорядка, ive отрегулировал высоту стола, чтобы соответствовать содержимому с помощью этого http://stackoverflow.com/questions/27945817/javafx-adapt-tableview-height-to-number- of-rows путем привязки prefHeightProperty таблицы к размеру списка. сам вызов не принимает так долго (испробовал отсчет времени), но если я быстро его прокомментирую. – 84n4n4

+0

@ 84n4n4 Я не понимаю комментарий о том, как долго 'table.getItems(). SetAll (...)' принимает. Я не запускаю 'getItems(). SetAll (...)' в фоновом потоке, я запускаю его в потоке приложения FX после завершения фонового потока.И, очевидно, даже если вы привязываете высоту таблицы к размеру списка элементов (какой tbh я не считаю достаточно надежным решением для использования), если вы только меняете список один раз (с помощью 'setAll (. ..) ') в отличие от добавления каждого элемента за раз, что тоже не является проблемой. Похоже, вам нужно выяснить, какова фактическая проблема в первую очередь. –

+0

извините за путаницу. Подготовка данных не является вопросом времени. установка данных в таблице не является вопросом времени. установка пустой или маленькой таблицы в моей панели, а не проблема времени. , но когда у вас много данных, все это ломается. >> Если вы только меняете список один раз (с setAll (...)), а не добавляете каждый элемент за раз, это тоже не проблема. Это именно то, что я делаю, с привязкой prefHeight его медленным, без его быстрого. Я взломаю небольшой экзамен и попытаюсь воспроизвести его и разместить здесь. – 84n4n4