Поиск по этому блогу

четверг, 29 ноября 2012 г.

Создаем свой Column Renderer для столбца таблицы. GXT

При работе с таблицами зачастую возникает необходимость отображать в ячйке таблицы нестандартное содержимое (содержимое отличное от простого текста). Таким содержимым может быть, например, комбобокс, текстовое поле, кнопка или даже панель, на которой могут быть и кнопки и комбобоксы и текстовые поля вместе. Для реализации отображения в ячейке таблицы такого содержимого необходимо столбцу, в котором это будет отображаться установить renderer. Renderer определяет, как будет отрисовываться содержимое каждой ячейки столбца.
// 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;
            }
        };
    }


Точно таким же образом  в ячейке может быть выведена кнопка или текстовое поле или что-угодно.


Комментариев нет:

Отправить комментарий