Я постоянно извлекаю данные (около 10-15 наименований) из своей базы данных (каждые 2 секунды)
каждый раз, когда он обновляет пользовательский интерфейс просто зависает.
Я пытался использовать запланированный сервис, поток и задачи для обновления пользовательского интерфейса, но он всегда зависает.
Я также попытался использовать наблюдаемый список для просмотра таблицы и просто удалитьAll () и addAll () (в соответствии с Обновления JavaFX 2.1 TableView )
Есть ли способ избежать блокировки потока пользовательского интерфейса?
РЕДАКТИРОВАНИЕ:
Он не запаздывает, если я удаляю tableViewConcern.getItems (). SetAll (service.getValue ()); часть, но как только я начинаю добавлять материал в базу данных, он становится все медленнее и медленнее (до тех пор, пока не остановится).
Внутри моего ActiveConcernService (ScheduledService) он просто получает данные из базы данных.
public class ActiveConcernService extends ScheduledService<ObservableList<Concern>> {
private UserAccount currentUser;
public ActiveConcernService(UserAccount currentUser) {
this.currentUser = currentUser;
}
public final ObservableList<Concern> getConcerns() {
ObservableList<Concern> concerns;
if(RoleService.getInstance().getById(currentUser.getRoleId()).getTitle().equals(Role.DefaultRole.ADMIN.getRole())){
concerns = FXCollections.observableList(ConcernService.getInstance().allNotDone());
} else {
concerns = FXCollections.observableList(ConcernService.getInstance().allByUser(currentUser));
}
return concerns; //gets the data from database base on the user role
}
@Override
protected Task<ObservableList<Concern>> createTask() {
return new Task<ObservableList<Concern>>() {
@Override
protected ObservableList<Concern> call() {
return getConcerns();
}
};
}
И в моем Контроллере это то, как я инициализирую заголовок столбца моей таблицы, а запланированная служба - единственные две части, где используется таблица.
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
// Initializes other ui elements (textfield, button, choicebox, etc)
initializeConcernTable();
ActiveConcernService service = new ActiveConcernService(currentUser);
service.setPeriod(Duration.millis(2000));
service.setOnSucceeded((t) -> {
tableViewConcern.getItems().setAll(service.getValue()); //Everytime this executes it lags
});
service.start();
}
private void initializeConcernTable() {
TableColumn<Concern, String> clientColumn = new TableColumn<>(Concern.NAME_HEADER);
clientColumn.setCellValueFactory(param -> param.getValue().getClientNameProperty());
clientColumn.setMinWidth(125);
clientColumn.setSortable(false);
TableColumn<Concern, String> remarkColumn = new TableColumn<>(Concern.REMARK_HEADER);
remarkColumn.setCellValueFactory(param -> param.getValue().getRemarkProperty());
remarkColumn.setMinWidth(175);
remarkColumn.setSortable(false);
TableColumn<Concern, String> categoryColumn = new TableColumn<>(Concern.CATEGORY_HEADER);
categoryColumn.setCellValueFactory(param -> new SimpleStringProperty(
CategoryService.getInstance().getById(param.getValue().getCatergoryId()).getTitle()));
categoryColumn.setMinWidth(150);
categoryColumn.setSortable(false);
TableColumn<Concern, String> assignToColumn = new TableColumn<>(Concern.EMPLOYEE_HEADER);
assignToColumn.setCellValueFactory(param -> new SimpleStringProperty(
UserAccountService.getInstance().getById(param.getValue().getUserAccountId()).getName()));
assignToColumn.setMinWidth(125);
assignToColumn.setSortable(false);
TableColumn<Concern, String> numberColumn = new TableColumn<>(Concern.NUMBER_HEADER);
numberColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper<String>(param.getValue().getNumber() + ""));
numberColumn.setSortable(false);
TableColumn<Concern, String> dateColumn = new TableColumn<>(Concern.DATE_HEADER);
dateColumn.setCellValueFactory(param -> new SimpleStringProperty(
param.getValue().getIssuedOn().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))));
dateColumn.setPrefWidth(150);
dateColumn.setSortable(false);
tableViewConcern.getColumns().addAll(numberColumn, assignToColumn, clientColumn, categoryColumn, remarkColumn,
dateColumn);
}