【问题标题】:GWT Celtable: two clicks needed to change checkbox state in FireFoxGWT Celtable:在 FireFox 中更改复选框状态需要单击两次
【发布时间】:2015-10-01 02:42:53
【问题描述】:

在我的项目中,我有带有 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);
                }
            }
    );
}

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

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

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

【问题讨论】:

  • 我以前在 Firefox 上遇到过不同的行为。您可以尝试将 BeforeSelectionHandler 添加到该行并检查该单元格是否是具有复选框的单元格。如果是,只需选择/取消选择它。当然,这应该只针对 Firefox。

标签: firefox gwt checkbox celltable gwt-celltable


【解决方案1】:

我今天发现,Chrome(版本 45.0.2454.101)也会发生同样的事情。 我对此进行了更多调查并发现了以下内容。 GWT CheckboxCell 默认只使用两个浏览器事件:keydownchange。在旧的 Chrome 版本中,当您单击复选框 change 触发事件并且一切正常。在 FireFox 和新的 Chrome 版本中,点击后没有 change 事件(我不知道为什么,欢迎解释),所以我决定创建我自己的扩展 AbstractEditableCell&lt;Boolean, Boolean&gt; 的复选框类并将消耗的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;
    }

}

我跳过了dependsOnSelectionhandlesSelection,因为我不将其用于选择列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2023-03-31
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多