Question

Je suis en train de créer une CellTable qui a une colonne avec un texte et une case à cocher, qui sera utilisé comme sélectionner toutes case à cocher (voir le dessin ci-dessous, « cb » est case à cocher). Actuellement, je suis en utilisant une classe dérivée de tête et il est primordial de rendre la méthode de sortie du texte et une case à cocher. Je suis PRÉPONDÉRANTS onBrowserEvent () mais il ne me fait donner ONCHANGE événements, qui fonctionnent bien, sauf que la case ne fonctionne pas correctement. Est-ce que quelqu'un a des idées sur ce sujet?

+-------+------------+
| col 1 | Select All |
|       |     cb     | 
+-------+------------+
| row 1 |     cb     |
+-------+------------+

Les questions que je vais avoir avec la case à cocher est que quand il est pas cochée, vous devez cliquer deux fois pour la coche apparaisse (au moins sur Chrome), même si elle est « vérifiée » la propriété est vrai que la première fois. Un clic correctement décoche.

Voici un code:

Configuration des colonnes 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);
}

Mon Tout sélectionner En-tête:

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;
    }

}
Était-ce utile?

La solution

Il semble que vous rendre une case cochée non à chaque fois que vous restituez l'en-tête, ce qui pourrait être Anéantir l'état de sélection chaque fois que la nouvelle rend celltable.

Essayez stocker l'état vérifié et rendu la case à cocher à l'état. On dirait que vous êtes à mi-chemin avec allSelected, vous êtes tout simplement pas l'utiliser.

EDIT Voici une implémentation de travail que je viens d'écrire pour Zanata (voir SearchResultsView.java ). L'interface HasValue est mis en oeuvre de sorte que les événements de changement de valeur peuvent être traitées d'une manière standard. Je ne l'ai pas rendu la méthode substituée, si vous voulez faire alors assurez-vous d'utiliser getValue() pour déterminer si vous restituez une vérification ou d'une case à cocher cochée. La sélection / logique de sélection est traité dans la classe présentateur associés (voir SearchResultsPresenter.java ).

private class CheckboxHeader extends Header<Boolean> implements HasValue<Boolean> {

   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<Boolean> 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;
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top