Можем ли мы динамически изменить значок кнопки GWT Bootstrap 3 ButtonCell?
У меня есть кнопка загрузки GWT 3 как ButtonCell, созданная с помощью IconType и ButtonType:
public abstract class ButtonColumn<T> extends Column<T, String> {
public ButtonColumn(IconType iconType, ButtonType buttonType) {
this(new ButtonCell(buttonType, iconType));
}
}
Поэтому, когда я создаю кнопку, я делаю
new ButtonColumn<Object>(IconType.PLAY, ButtonType.SUCCESS) {
@Override
public void onClick(Object obj) {
doStuff(obj);
}
};
Я хочу изменить свою кнопку IconType на клик. Можно ли этого добиться? И можно ли создать собственный IconType, расширяющий список EnT GWT IconType? Я хотел поставить анимированный значок (например, значок загрузки).
1 ответ
Ну, вы не можете изменить значок кнопки в строке, особенно когда вы создаете весь столбец с уже указанным значком. Но вы можете redraw()
ряд, и это может быть способом достичь того, что вы хотите.
Я использую AbstractCell для рендеринга кнопки и onBrowserEvent:
- сначала создайте AbstractCell с
ClickEvent
вconsumedEvents
параметр - в
render()
метод визуализации кнопки в зависимости от состояния нажатия - в
onBrowserEvent()
метод изменения состояния щелчка и повторной визуализации строки
Состояние clicked лучше всего хранить в базовом типе данных таблицы, чтобы оно было доступно для каждой строки.
Вот полный рабочий пример кода:
final CellTable<TableType> table = new CellTable<TableType>();
AbstractCell<TableType> buttonCell = new AbstractCell<ButtonCellTest.TableType>(ClickEvent.getType().getName()) {
@Override
public void render(Context context, TableType value, SafeHtmlBuilder sb) {
Button button = new Button();
button.setType(ButtonType.SUCCESS);
button.setSize(ButtonSize.SMALL);
button.add(new Icon(value.isClicked() ? IconType.CHECK : IconType.TIMES));
sb.append(SafeHtmlUtils.fromTrustedString(button.toString()));
}
@Override
public void onBrowserEvent(Context context, Element parent, TableType value, NativeEvent event, ValueUpdater<TableType> valueUpdater) {
value.setClicked(!value.isClicked());
// ... do stuff...
table.redrawRow(context.getIndex());
}
};
table.addColumn(new Column<TableType, TableType>(buttonCell) {
@Override
public TableType getValue(TableType object) {
return object;
}
});
ArrayList<TableType> rowData = new ArrayList<TableType>();
rowData.add(new TableType("row 1"));
rowData.add(new TableType("row 2"));
...
table.setRowData(rowData);
И пример типа таблицы данных, сохраняющих нажатие:
public class TableType {
String text;
boolean clicked = false;
public TableType(String text) {
this.text = text;
}
public String getText() {
return text;
}
public boolean isClicked() {
return clicked;
}
public void setClicked(boolean clicked) {
this.clicked = clicked;
}
}
Что касается расширения IconType
enum - нет, вы не можете расширять enum в Java. Посмотрите на этот вопрос, например: Можно ли перечислить перечисления для добавления новых элементов?,
Вы можете попробовать добавить свой собственный CSS
класс, но это нужно задать как еще один вопрос, чтобы получить точные ответы.