私はいくつかのテキストとチェックボックスを選択するすべてのチェックボックスとして使用される列を持つCellTableを作成しようとしています(下の図を参照して、
“cb”はチェックボックスです)。現在、Headerから派生したクラスを使用しており、テキストとチェックボックスを出力するレンダリングメソッドをオーバーライドしています。私はonBrowserEvent()をオーバーライドしていますが、チェックボックスが正しく機能しない点を除いて、正常に動作するはずのonChangeイベントのみを与えています。誰にもこれに関するアイデアはありますか?
+-------+------------+
| col 1 | Select All |
| | cb |
+-------+------------+
| row 1 | cb |
+-------+------------+
私がチェックボックスで抱えている問題は、チェックされていないときは、最初にチェックされたプロパティであっても、チェックマークを表示するには2回クリックする必要があります(少なくともChromeでは)。ワンクリックで正しく選択が解除されます。
ここにいくつかのコードがあります:
CellTable列を設定する:
/** Setup the table's columns. */
private void setupTableColumns() {
//Add the first column:
TextColumn column1 = new TextColumn() {
@Override
public String getValue(final MyObject object) {
return object.getColumn1Text();
}
};
table.addColumn(macColumn, SafeHtmlUtils.fromSafeConstant("Column1"));
//the checkbox column for selecting the lease
Column checkColumn = new Column(
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 {
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;
}
}
ヘッダーをレンダするたびに、チェックされていないチェックボックスがレンダリングされているように見えます。これは、セルテーブルが再レンダリングされるたびに選択状態を消去する可能性があります。
チェックされた状態を保存し、その状態でチェックボックスをレンダリングしてみてください。
allSelected
で半分になっているようですが、あなたはそれを使用していないだけです。
EDIT Here is a working implementation I’ve just
written for Zanata (see SearchResultsView.java). The HasValue
interface is implemented so that value change events can be handled
in a standard way. I have not overridden the render method, if you
want to do so make sure you use getValue()
to
determine whether you render a checked or an unchecked checkbox.
The selection/de-selection logic is handled in the associated
presenter class (see SearchResultsPresenter.java).
private class CheckboxHeader extends Header implements HasValue {
private boolean checked;
private HandlerManager handlerManager;
public CheckboxHeader()
{
//TODO consider custom cell with text
super(new CheckboxCell());
checked = false;
}
//This method is invoked to pass the value to the CheckboxCell's render method
@Override
public Boolean getValue()
{
return checked;
}
@Override
public void onBrowserEvent(Context context, Element elem, NativeEvent nativeEvent)
{
int eventType = Event.as(nativeEvent).getTypeInt();
if (eventType == Event.ONCHANGE)
{
nativeEvent.preventDefault();
//use value setter to easily fire change event to handlers
setValue(!checked, true);
}
}
@Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler)
{
return ensureHandlerManager().addHandler(ValueChangeEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event)
{
ensureHandlerManager().fireEvent(event);
}
@Override
public void setValue(Boolean value)
{
checked = value;
}
@Override
public void setValue(Boolean value, boolean fireEvents)
{
checked = value;
if (fireEvents)
{
ValueChangeEvent.fire(this, value);
}
}
private HandlerManager ensureHandlerManager()
{
if (handlerManager == null)
{
handlerManager = new HandlerManager(this);
}
return handlerManager;
}
}