テキストとチェックボックスを含む列を持つCellTableを作成しようとしています。このチェックボックスは、[すべて選択]チェックボックスとして使用されます(下の図を参照してください。「cb」はチェックボックスです)。現在、Headerから派生したクラスを使用しており、そのrenderメソッドをオーバーライドして、テキストとチェックボックスを出力しています。onBrowserEvent()をオーバーライドしていますが、onChangeイベントのみが表示されます。これは、チェックボックスが正しく機能しないことを除いて正常に機能します。誰かがこれについて何か考えを持っていますか?
+-------+------------+
| col 1 | Select All |
| | cb |
+-------+------------+
| row 1 | cb |
+-------+------------+
チェックボックスで私が抱えている問題は、チェックされていない場合、最初に「チェックされた」プロパティがtrueであっても、チェックマークが表示されるようにするには2回クリックする必要があることです(少なくともChromeでは)。ワンクリックで正しくチェックを外します。
ここにいくつかのコードがあります:
CellTable列を設定します。
/** Setup the table's columns. */
private void setupTableColumns() {
// Add the first column:
TextColumn<MyObject> column1 = new TextColumn<MyObject>() {
@Override
public String getValue(final MyObject object) {
return object.getColumn1Text();
}
};
table.addColumn(macColumn, SafeHtmlUtils.fromSafeConstant("Column1"));
// the checkbox column for selecting the lease
Column<MyObject, Boolean> checkColumn = new Column<MyObject, Boolean>(
new CheckboxCell(true, false)) {
@Override
public Boolean getValue(final MyObject object) {
return selectionModel.isSelected(object);
}
};
SelectAllHeader selectAll = new SelectAllHeader();
selectAll.setSelectAllHandler(new SelectHandler());
table.addColumn(checkColumn, selectAll);
}
私のすべてのヘッダーを選択:
public static class SelectAllHeader extends Header<Boolean> {
private final String checkboxID = "selectAllCheckbox";
private ISelectAllHandler handler = null;
@Override
public void render(final Context context, final SafeHtmlBuilder sb) {
String html = "<div>Select All<div><input type=\"checkbox\" id=\"" + checkboxID + "\"/>";
sb.appendHtmlConstant(html);
}
private final Boolean allSelected;
public SelectAllHeader() {
super(new CheckboxCell());
allSelected = false;
}
@Override
public Boolean getValue() {
Element checkboxElem = DOM.getElementById(checkboxID);
return checkboxElem.getPropertyBoolean("checked");
}
@Override
public void onBrowserEvent(final Context context, final Element element, final NativeEvent event) {
Event evt = Event.as(event);
int eventType = evt.getTypeInt();
super.onBrowserEvent(context, element, event);
switch (eventType) {
case Event.ONCHANGE:
handler.onSelectAllClicked(getValue());
event.preventDefault();
break;
default:
break;
}
}
public void setSelectAllHandler(final ISelectAllHandler handler) {
this.handler = handler;
}
}