GWT CellTable сохраняет фокус на выбранной строке

Когда я выбираю строку в CellTable, содержащую несколько столбцов, вся строка окрашивается в желтый цвет. Это не зависит от того, в какой области строки я щелкаю (какой столбец строки).

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

Я пытался использовать модель выбора, но это ничего не изменило. У вас есть какой-нибудь совет или это просто невозможно, так как фокусом управляет браузер? Поведение такое же в витрине Google для CellTable...


person Adrian    schedule 13.02.2013    source источник


Ответы (5)


Модель выбора на самом деле делает то, что вы хотите сделать: она окрашивает строку в синий цвет, и строка не меняет цвет, если вы щелкнете в другом месте страницы. (Только когда выбрана другая строка)

Существует 2 модели выбора: одна позволяет выбрать только одну строку, а другая позволяет выбирать несколько строк.

MultiSelectionModel<Row> selectionModel = new MultiSelectionModel<Row>();
table.setSelectionModel(selectionModel);

SingleSelectionModel<Row> selectionModel = new SingleSelectionModel<Row>();
table.setSelectionModel(selectionModel);
person Spiff    schedule 13.02.2013

Решение пользователя 905374 действительно сработало. В своем первом сообщении я упомянул, что уже пробовал решение с selectionModel, и оно не сработало. Это было частично правдой. Это работает, но только если таблица НЕ содержит CheckboxCell.

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

    final CellTable<LicenceDto> licenseTable = new CellTable<LicenceDto>();
    final SingleSelectionModel<LicenceDto> selectionModel = new SingleSelectionModel<LicenceDto>();
    licenseTable.setSelectionModel(selectionModel);

    //--- If I add this column, the selection does work.
    Column<LicenceDto, String> workingColumn = new Column<LicenceDto, String>(new TextCell()) {

        @Override
        public String getValue(LicenceDto object) {
            return "Works";
        }
    };
    workingColumn.setFieldUpdater(new FieldUpdater<LicenceDto, String>() {

        @Override
        public void update(int index, LicenceDto object, String value) {
            ;
        }
    });
    licenseTable.addColumn(workingColumn);


    //--- If I add this column, the selection does NOT work anymore.
    Column<LicenceDto, Boolean> notWorkingColumn = new Column<LicenceDto, Boolean>(new CheckboxCell(true, true)) {

        @Override
        public Boolean getValue(LicenceDto object) {
            return object.getEnabled();
        }
    };
    notWorkingColumn.setFieldUpdater(new FieldUpdater<LicenceDto, Boolean>() {

        @Override
        public void update(int index, LicenceDto object, Boolean value) {
            presenter.enableLicense(object, value);
        }
    });
    licenseTable.addColumn(notWorkingColumn);

Вы даже можете объединить несколько ячеек и добавить их в таблицу (например, LinkActionCell и т. д.). Пока нет CheckboxCell, синий выбор с SingleSelectionModel работает как шарм. Кто-нибудь видит, что я делаю неправильно с этим CheckboxCell или это ошибка?


ОБНОВЛЕНИЕ

Это была просто моя ошибка использования. Проблема заключалась в том, что я установил handlesSelection в true (второй параметр конструктора CheckboxCell), даже если думал, что ничего не обрабатываю. Установка его на false решает проблему.

Итог: используйте модель выбора (например, SingleSelectionModel) и не устанавливайте для параметра handlesSelection значение true конструктора CheckboxCell значение true, если вы не обрабатываете выбор самостоятельно.

person Adrian    schedule 14.02.2013
comment
Я проверил это в своем приложении, и, похоже, вы правы. Флажок, а также раскрывающийся список препятствует выбору строки. Я думаю, вы должны опубликовать это как отдельный вопрос. - person Spiff; 14.02.2013
comment
Спасибо за ваше подтверждение. Я разместил новый вопрос по ссылке - person Adrian; 15.02.2013
comment
Я хотел опубликовать ответ на мою ошибку CheckboxCell выше. Это была просто моя ошибка использования: проблема заключалась в том, что я установил handlesSelection = true (второй параметр конструктора CheckboxCell), даже если думал, что ничего не обрабатываю. Установка его в false решает проблему. - person Adrian; 15.02.2013

Вы должны снова просмотреть демонстрацию Showcase. На этот раз используйте флажок в самом левом столбце, то есть в первом столбце. On selection the row turns blue указывает на то, что выбор строки сделан. Это когда у вас настроена SelectionModel. Щелкните страницу в любом месте за пределами CellTable/DataGrid selection is not changed.

Теперь вместо того, чтобы выбирать строку с помощью флажка в первом столбце, вы нажимаете на строку в любом другом столбце. Ряд становится желтым. Щелкните страницу в любом месте за пределами CellTable/DataGrid focus/yellow is lost.

"выделено желтым цветом" означает, что строка находится в фокусе и редактируется, но не выбрана.

Примечание. Вы можете принудительно выбрать строку, используя события щелчка для каждой ячейки.

person appbootup    schedule 13.02.2013

Попробуйте что-то вроде этого:

CellTable table;
YourDataObject object = new YourDataObject(...);
SingleSelectionModel<YourDataObject> selectionModel = 
                                     new SingleSelectionModel<YourDataObject>();
table.setSelectionModel(selectionModel);
...
table.setSelected(object, true);

Используйте MultiSelectionModel, если вы хотите выделить более одной строки.

person marcel    schedule 14.02.2013

Сохраните индекс выбранной строки. Когда пользователь выбирает строку, измените стиль строки на некоторый «выбранный стиль», подходящий для вашего случая (определенный в вашем файле css), и удалите выбранный стиль из ранее выбранной строки. Также не забудьте обновить индекс выбранной строки.

Если вы предоставите код из исходной версии, я с удовольствием помогу вам с кодом.

person qben    schedule 14.02.2013