Можем ли мы динамически изменить значок кнопки 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 класс, но это нужно задать как еще один вопрос, чтобы получить точные ответы.

Другие вопросы по тегам