2016-11-12 2 views
1

У меня есть приложение javafx с TableView. Только первый столбец (dataTypeColumn) доступен для редактирования и содержит ComboBox для редактирования. Теперь делает то, что он должен делать, однако при запуске редактирования ячейки происходит комбинация странных ошибок, а затем прокручивается из нее без редактирования. Я уверен, что это из-за того, что TableView повторно использует ячейки. Однако я не нашел возможности вмешаться с ним, например, запретить повторное использование ячеек, которые в настоящее время редактируются. Можете ли вы помочь мне в этом.JavaFX Table view Cell Reuse

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

Колонка в вопросе содержит значения перечисления DataType У меня есть завод ячейки этого столбца, глядя, как это:

dataTypeColumn.setCellFactory(param -> new ComboBoxTableCell<>(DataType.values())); 

Значения столбца читается так:

dataTypeColumn.setCellValueFactory(param -> Bindings.valueAt(configuration, param.getValue())); 

В случае, если это сбивает с толку, предметы, которые я даю своим TableView, являются Integers (от 0 до n-1), а в другом столбце CellValueFactories действительные значения будут загружаться в зависимости от Integer, связанный с текущим столбцом.

Поэтому при его редактировании он отображает ComboBox со всеми значениями, которые могут иметь DataType, и давайте выбрать один из них. У меня есть обратный вызов на колонке, которая реагирует на порученное событие Edit и выглядит следующим образом:

public void editCommited(TableColumn.CellEditEvent<Integer, DataType> event) { 
     //configuration is an ObservableList containing DataType elements 
     configuration.set(event.getRowValue(), event.getNewValue()); 
    } 

Так о проблемах, которые возникают. В начале все ячейки в этом столбце имеют одинаковое значение: «ничего не выбрано». Это специальное значение enum, зарезервированное для этого случая, поскольку я не нашел функцию setPlaceholder в классе ComboBoxTableCell. Когда я знаю, что начинаю редактировать одну из ячеек, а затем прокручивать ее вне поля зрения, одна из следующих строк также будет вдаваться в состояние редактирования, даже если эта строка не была затронута раньше. Если я прокручу дальше, ячейка в состоянии редактирования появится каждый раз, когда предыдущий прокручивается вне поля зрения. Я также могу вернуться и найти те же ячейки в состоянии редактирования. Если я отредактирую ячейку, которая не должна находиться в состоянии редактирования, она не изменится, но вместо этого ячейка, которую я первоначально пыталась изменить, изменит ее значение. Это может быть связано с базовым ObservableList, который автоматически обновляет значение в столбце.

Если я начну редактировать ячейку, которая имеет другое значение (из предыдущего редактирования), происходит нечто более странное. При повторном просмотре новой строки новая страница будет иметь ячейку на странице редактирования, но со значением по умолчанию «ничего не выбрано». Если я прокручу назад, то ячейка, которую я попытался изменить, изначально больше не будет в состоянии редактирования, но значение изменилось на «ничего не выбрано». Как будто новая ячейка, получившая состояние редактирования, каким-то образом совершила свою собственную ценность.

Пожалуйста некоторую помощь с этим :)

ответ

2

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

Вы можете легко создать обходной путь для этого buf, так как вам просто нужно отменить редактирование, когда элемент будет заменен. Вы можете, например,использовать этот метод для создания cellFactory по своему усмотрению:

public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> comboBoxCellFactory(ObservableList<T> items) { 
    if (items == null) { 
     throw new IllegalArgumentException(); 
    } 
    return column -> new ComboBoxTableCell<S, T>(items) { 

     @Override 
     public void updateIndex(int i) { 
      cancelEdit(); 
      super.updateIndex(i); 
     } 

    }; 
} 
+0

Ницца, updateIndex функция Я искал. Даже запустил eventdispatcher, чтобы проверить, могу ли я реагировать на повторное использование там xD. Спасибо за быстрый ответ :) – findusl