在我的项目中,我有带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建议的所有内容:
答案 0 :(得分:0)
正如我今天发现的那样,Chrome(版本45.0.2454.101)也会发生同样的事情。
我对此进行了更多调查,并找出以下内容。 GWT CheckboxCell
默认只使用两个浏览器事件:keydown
和change
。在旧的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
因为我没有将它用于选择列。