2015-09-12 2 views
0

у меня есть проблемы с установкой элемента в 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 секунд, почему? потому что у меня слишком много узлов в моей текущей сцене ???

+0

Ваш код мне кажется, хорошо, так что, может быть, вы можете попытаться создать результат как ObservableList в 'setOnSucceeded' метод (если это FX-Thread). Является ли 'countriesDao.queryForAll()' async? Или это блокирование? – NwDev

+0

Да, запрос все блокирует это, почему я помещаю ita в другой поток. – karim

+0

Если вы замените свой настоящий код базы данных кодом, который просто блокируется в течение некоторого времени, а затем возвращает фиксированный список из 150 элементов, он показывает то же поведение? Если это так, используйте это для создания [MCVE]. Также обратите внимание, что 'ChoiceBox' явно предназначен для небольшого количества элементов. Вместо этого вы можете попробовать «ComboBox». –

ответ

0

Используйте ChoiceBox только если у вас есть < 10 пунктов, иначе использование ComboBox

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