у меня есть проблемы с установкой элемента в ChoiceBox
, поэтому поясню я должен загрузить данные из базы данных я сделать это в другом потоке:Установка ChoiceBox вещь слишком медленно JavaFX
final Service<ObservableList<Country>> countryService = new Service<ObservableList<Country>>() {
@Override
protected Task<ObservableList<Country>> createTask() {
return new Task<ObservableList<Country>>() {
@Override
protected ObservableList<Country> call() throws Exception {
Dao<Country, Integer> countriesDao = null;
List<Country> result = null;
try {
countriesDao = DaoManager.createDao(Connection.getNewInstance(), Country.class);
System.out.println("getting data");
result = countriesDao.queryForAll();
System.out.println("got data");
} catch (SQLException ex) {
Logger.getLogger(ListClientsController.class.getName()).log(Level.SEVERE, null, ex);
}
return FXCollections.observableArrayList(result);
}
};
}
};
countryService.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
// taking a lot of time here like 4-5 second and freeze
// the gui(normal because it executed in Javafx Application Thread
// but why its take so much time??
cbSearchCountry.setItems(countryService.getValue());
}
});
countryService.start();
доступа к базе данных Обычно следует принимать время дольше, чем установка списка ChoiceBox, но нет здесь извлечение 150 записей из моей базы данных мгновенно, но список наблюдаемых параметров для моего ChoiceBox занимает около 5 секунд, почему? потому что у меня слишком много узлов в моей текущей сцене ???
Ваш код мне кажется, хорошо, так что, может быть, вы можете попытаться создать результат как ObservableList в 'setOnSucceeded' метод (если это FX-Thread). Является ли 'countriesDao.queryForAll()' async? Или это блокирование? – NwDev
Да, запрос все блокирует это, почему я помещаю ita в другой поток. – karim
Если вы замените свой настоящий код базы данных кодом, который просто блокируется в течение некоторого времени, а затем возвращает фиксированный список из 150 элементов, он показывает то же поведение? Если это так, используйте это для создания [MCVE]. Также обратите внимание, что 'ChoiceBox' явно предназначен для небольшого количества элементов. Вместо этого вы можете попробовать «ComboBox». –