При работе с таблицами зачастую возникает необходимость отображать в ячйке таблицы нестандартное содержимое (содержимое отличное от простого текста). Таким содержимым может быть, например, комбобокс, текстовое поле, кнопка или даже панель, на которой могут быть и кнопки и комбобоксы и текстовые поля вместе. Для реализации отображения в ячейке таблицы такого содержимого необходимо столбцу, в котором это будет отображаться установить renderer. Renderer определяет, как будет отрисовываться содержимое каждой ячейки столбца.
Напомню, что для создания таблицы необходимо предварительно создать store для хранения моделей, список конфигураторов столбцов таблицы и модель столбцов таблицы на основании списка конфигураторов столбцов.
Создавать модель столбцов таблицы нужно после того как созданы конфигураторы для всех столбцов и добавлены в список.
Теперь вернемся непосредственно к методу getSignalingRenderer(). Он будет возвращать GridCellRenderer<ModelData>. У этого объекта GridCellRenderer, мы переопределим метод render() таким образом чтобы он возвращал комбобокс.
Точно таким же образом в ячейке может быть выведена кнопка или текстовое поле или что-угодно.
// Signaling // Создаем конфигуратор столбца ColumnConfig column = new ColumnConfig(); column.setHeader("Signaling"); // устанавливаем заголовок столбца column.setWidth(130); // устанавливаем ширину столбца column.setId("signalingDto.signaling"); // устанавливаем id column.setRenderer(getSignalingRenderer()); // устанавливаем renderer configs.add(column); // добавляем в список конфигураторов
Напомню, что для создания таблицы необходимо предварительно создать store для хранения моделей, список конфигураторов столбцов таблицы и модель столбцов таблицы на основании списка конфигураторов столбцов.
// список конфигураторов столбцов таблицы List<ColumnConfig> configs = new ArrayList<ColumnConfig>(); // store для моделей ListStore store = new ListStore<ModelData>(); // модель столбцоы таблицы ColumnModel cm = new ColumnModel(configs); // создаем саму таблицу на основе store и модели столбцов EditorGrid<ModelData> grid = new EditorGrid<ModelData>(store, cm);
Создавать модель столбцов таблицы нужно после того как созданы конфигураторы для всех столбцов и добавлены в список.
// список конфигураторов столбцов таблицы List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
configs.add(column); // добавляем в список конфигураторов
/ модель столбцов таблицы ColumnModel cm = new ColumnModel(configs);
Теперь вернемся непосредственно к методу getSignalingRenderer(). Он будет возвращать GridCellRenderer<ModelData>. У этого объекта GridCellRenderer, мы переопределим метод render() таким образом чтобы он возвращал комбобокс.
private GridCellRenderer<ModelData> getSignalingRenderer() { return new GridCellRenderer<ModelData>() { // Переопределяем метод render // в нем будем возвращать то, что хотим увидеть в каждой ячейке столбца // здесь - это комбобокс @Override public Object render(final ModelData model, final String property, final ColumnData config, final int rowIndex, final int colIndex, final ListStore<ModelData> store, final Grid<ModelData> grid) { // создаем комбобокс final SignalingComboBox signalingCombobox = new SignalingComboBox(); // делаем его на 10 пикселей по ширине меньше чем ширина ячейки // это нужно для того, чтобы было видно границы комбобокса signalingCombobox.setWidth(grid.getColumnModel().getColumnWidth(colIndex) - 10); // тут дабавляем слушателя к комбобоксу на события изменения // выбора значения signalingCombobox.addListener(Events.Change, new Listener<BaseEvent>() { @Override public void handleEvent(final BaseEvent be) { Field f = (Field) be.getSource(); ModelData m = (ModelData) f.getValue(); model.set("signalingDto", f.getValue()); grid.getStore().update(model); grid.getStore().commitChanges(); } }); // возвращаем комбобокс return signalingCombobox; } }; }
Точно таким же образом в ячейке может быть выведена кнопка или текстовое поле или что-угодно.
Комментариев нет:
Отправить комментарий