GWT Celtable:需要两次点击才能更改FireFox中的复选框状态

时间:2014-12-18 12:24:48

标签: firefox gwt checkbox celltable gwt-celltable

在我的项目中,我有带CheckBoxCell列的CellTable。这是表示(更改)值的常规列,不用于行选择(用于选择我使用SingleSelectionModel)。在Chrome中,一切正常,第一次点击我更改了复选框状态并选择了行。在FireFox中,当我尝试单击CheckBoxCell列中的复选框时,GWT选择行,然后在第二次单击复选框后更改复选框状态。但我需要与Chrome中相同的行为(首次点击时更改复选框状态)。

以下是我创建列的方法:

private <C> Column<T, C> addColumn(CellTable<T> itemListTable, Cell<C> cell, String headerText, int columnWidthPct, final IValueGetter<C, T> getter, @Nullable FieldUpdater<T, C> fieldUpdater) {
    Column<T, C> column = new Column<T, C>(cell) {
        @Override
        public C getValue(T object) {
            return getter.getValue(object);
        }
    };
    column.setFieldUpdater(fieldUpdater);
    column.setSortable(false);
    itemListTable.addColumn(column, headerText);
    itemListTable.setColumnWidth(column, columnWidthPct, PCT);
    return column;
}

private void generateExistingSettingsTable() {
    addColumn(existingSettingsTable, new ParameterizedCheckboxCell<T>(), IS_PUBLIC_HEADER, 10, new IValueGetter<Boolean, T>() {
                @Override
                public Boolean getValue(T setting) {
                    return setting.isPublic();
                }
            },
            new FieldUpdater<T, Boolean>() {
                @Override
                public void update(int index, T object, Boolean value) {
                    object.setPublic(value);
                    updatePublicState(object);
                }
            }
    );
}

My ParameterizedCheckboxCell扩展CheckboxCell并仅覆盖渲染方法(启用\禁用复选框输入)。

我已经尝试了here建议的所有内容:

  • stopPropagation对我不起作用
  • 将列添加到DefaultSelectionEventManager黑名单,不是一个选项(非常大的区域左侧无法点击复选框)

1 个答案:

答案 0 :(得分:0)

正如我今天发现的那样,Chrome(版本45.0.2454.101)也会发生同样的事情。 我对此进行了更多调查,并找出以下内容。 GWT CheckboxCell默认只使用两个浏览器事件:keydownchange。在旧的Chrome版本中,当您点击复选框change事件时,一切正常。在FireFox和新的Chrome版本中,点击后没有change事件(我无法找出原因,欢迎解释),所以我决定创建我自己的复选框类{ {1}}并将消费的AbstractEditableCell<Boolean, Boolean>替换为change事件。这是我得到的:

click

我跳过了import java.util.Objects; import com.google.gwt.cell.client.AbstractEditableCell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import static com.google.gwt.dom.client.BrowserEvents.CLICK; import static com.google.gwt.dom.client.BrowserEvents.KEYDOWN; public class ParameterizedCheckboxCell extends AbstractEditableCell<Boolean, Boolean> { public ParameterizedCheckboxCell() { super(KEYDOWN, CLICK); } @Override public void render(Context context, Boolean value, SafeHtmlBuilder sb) { // Here i have some specific logic so i skip this part // You can just copy/paste body of this method from original CheckboxCell } @Override public void onBrowserEvent(Context context, Element parent, Boolean value, NativeEvent event, ValueUpdater<Boolean> valueUpdater) { final String type = event.getType(); final boolean enterPressed = KEYDOWN.equals(type) && event.getKeyCode() == KeyCodes.KEY_ENTER; if (CLICK.equals(type) || enterPressed) { InputElement input = parent.getFirstChild().cast(); Boolean isChecked = input.isChecked(); if (enterPressed) { isChecked = !isChecked; input.setChecked(isChecked); } if (Objects.equals(value, isChecked)) { clearViewData(context.getKey()); } else { setViewData(context.getKey(), isChecked); } valueUpdater.update(isChecked); } } @Override public boolean isEditing(Context context, Element parent, Boolean value) { return false; } } dependsOnSelection因为我没有将它用于选择列。