Композитная ячейка в ГВТ-приложении
Я пытаюсь создать CompositeCell, который состоит из TextCell и ButtonCell. Я хочу добавить CompositeCell в столбец обычно, а затем столбец в CellTable. Однако я не могу понять, каким должен быть экземпляр столбца. В частности, я не могу найти параметры его типа в следующем коде:
Column<FilterInfo, ?> compositeColumn = new Column<FilterInfo, ?>(createCompositeCell()) {
@Override
public Object getValue(Object object) {
// TODO Auto-generated method stub
return null;
}};
Метод, который создает CompositeCell пользовательского класса FilterInfo (это необходимо?):
private CompositeCell<FilterInfo> createCompositeCell(){
HasCell<FilterInfo, String> filterName = new HasCell<FilterInfo, String>() {
public Cell<String> getCell() {
return new TextCell();
}
public FieldUpdater<FilterInfo, String> getFieldUpdater() {
// TODO Auto-generated method stub
return null;
}
public String getValue(FilterInfo object) {
return object.getFilterName();
}};
HasCell<FilterInfo, String> filterButton = new HasCell<FilterInfo,String>(){
public Cell<String> getCell() {
return new ButtonCell();
}
public FieldUpdater<FilterInfo, String> getFieldUpdater() {
// TODO Auto-generated method stub
return null;
}
public String getValue(FilterInfo object) {
// TODO Auto-generated method stub
return "...";
}
};
List<HasCell<FilterInfo, ?>> cells = new ArrayList<HasCell<FilterInfo, ?>>();
cells.add(filterName);
cells.add(filterButton);
CompositeCell<FilterInfo> compositeCell = new CompositeCell<FilterInfo>(cells);
return compositeCell;
}
Я был бы признателен за любые указания, чтобы адаптировать код или другое предложение для создания требуемого CompositeCell и правильно добавить его в CellTable.
4 ответа
Вы должны использовать составную ячейку? Мне кажется, что это большая работа, и может быть намного проще просто создать собственную ячейку.
Ознакомьтесь с документацией по созданию пользовательских ячеек
Не пытайтесь слишком сосредоточиться на параметре типа здесь. Ваша IDE слишком умна и выдает ошибку типа. Он будет жаловаться "Необработанный тип. XXX
Вот код для получения столбца с кнопкой CompositeCell из N:
private Column<DTO, DTO> getButtonColumn() {
return new Column<DTO, DTO>(getButtonsCell()) {
@Override
public DTO getValue(DTO object) {
return object;
}
};
}
private CompositeCell getButtonsCell() {
HasCell<DTO,DTO> button1 = new AbstractActionButton<DTO>() {
@Override
public void execute(final DTO object) {
//Action on button click
}
@Override
public void render(Context context, DTO data, SafeHtmlBuilder sb) {
//
}
};
HasCell<DTO,DTO> button2 = new AbstractActionButton<DTO>(){
//Complete me ...
}
List<HasCell<DTO, ?>> cells = new LinkedList<>();
cells.add(button1);
cells.add(button2);
CompositeCell<DTO> compositeCell = new CompositeCell<>(cells);
return compositeCell;
}
public abstract class AbstractActionButton<DTO> implements HasCell<DTO, DTO> {
@Override
public Cell<DTO> getCell() {
return new ActionCell<DTO>("Button title", new ActionCell.Delegate<DTO>() {
@Override
public void execute(DTO object) {
AbstractActionButton.this.execute(object);
}
}) {
@Override
public void render(Context context, DTO data, SafeHtmlBuilder sb) {
AbstractActionButton.this.render(context, data, sb);
}
};
}
//Replaced by delegate but still need to be overriden
@Override
public FieldUpdater<DTO, DTO> getFieldUpdater() {
return null;
}
@Override
public DTO getValue(DTO object) {
return object;
}
/**
* You can override this method to render your button differently. Not mandatory
* @param context
* @param data
* @param sb
*/
public abstract void render(Context context, DTO data, SafeHtmlBuilder sb);
/**
* Called when the button is clicked
* @param object
*/
public abstract void execute(DTO object);
}
Если твой CellTable
занимает список FilterInfo
и ваш Cell
занимает FilterInfo
затем используйте IdentityColumn
,
Я создал составную ячейку (Checkboxcell + TextCell), используя GXT XTemplate для визуализации текста текстовой ячейки. Используйте Шаблон, если вы хотите придерживаться чистого GWT, а также заменить другие виджеты GXT на GWT.