Обновление табличного javafx без блочного потока пользовательского интерфейса - PullRequest
0 голосов
/ 16 марта 2019

Я постоянно извлекаю данные (около 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);
}

1 Ответ

0 голосов
/ 16 марта 2019

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

    TableColumn<Concern, String> categoryColumn = new TableColumn<>(Concern.CATEGORY_HEADER);
    categoryColumn.setCellValueFactory(param -> new SimpleStringProperty(
            CategoryService.getInstance().getById(param.getValue().getCatergoryId()).getTitle())); //This part was the one that was making it lag
    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())) ; //This part was the one that was making it lag
    assignToColumn.setMinWidth(125);
    assignToColumn.setSortable(false);

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

Спасибо Фабиан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...