2012-01-03 11 views
5

Soy bastante nuevo en GWT, pero he estado progresando bastante rápido hasta ahora.GWT CellTable, desactive ButtonCell cuando haga clic en

Tengo una tabla de células, la mayoría de las cuales son datos de solo lectura devueltos por un RPC.

Tengo dos columnas en la tabla de celda con las que el usuario puede interactuar. Uno es un TextInputCell, el otro es un ButtonCell.

Cuando el usuario hace clic en ButtonCell, quiero enviar el valor en el TextInputCell para esa fila a un RPC.

Tengo todo esto funcionando.

La parte que no puedo poner en práctica es que cuando se hace clic en el botón (ButtonCell), quiero desactivar el botón en esa fila hasta que regrese el RPC, y luego volver a habilitarlo. También quiero borrar el texto en la celda de entrada para esa fila cuando regrese el RPC.

No puedo encontrar la forma de obtener identificadores para el objeto real ButtonCell al que se hizo clic o el TextInputCell para simularlos.

Cualquier ayuda apreciada.

bq

Respuesta

4

El problema es que no hay ningún objeto para el botón que se ha hecho clic. Su ButtonCell crea HTML que procesa botones: cada botón de la columna completa fue escrito por la misma celda de botón, pero no hay ningún objeto Java asociado a ellos.

Para deshabilitar el botón directamente, primero tendrá que crearle un identificador. Usted puede hacer esto presentando un id. En el html que crea su ButtonCell, y luego obteniendo el elemento por id del DOM.

Lo que hago en un caso similar es simplemente volver a procesar toda la tabla cuando hay un cambio de estado. No tarda tanto, y no necesita almacenar ninguna referencia (la razón completa por la que está usando CellTable en lugar de Grid de todos modos). Cuando sepa que su botón debe estar desactivado, simplemente lo deshabilita.

Ambas sugerencias requerirían que se subclasifiquen sus objetos de celda para que pueda hacer una representación personalizada. No es muy difícil, pero encajar el orden de las operaciones puede ser confuso. ¡Buena suerte!

PD: Si solo desea deshabilitar el botón (y no vaciar el campo de texto), creo que onBrowserEvent le da un identificador al Element que se hizo clic; es posible que pueda usarlo para deshabilitarlo.

4

He tenido este problema, pero finalmente lo resolví.

este código de verificación

package com.ex7.client; 

import com.google.gwt.cell.client.ButtonCell; 
import com.google.gwt.cell.client.ValueUpdater; 
import com.google.gwt.dom.client.Element; 
import com.google.gwt.dom.client.NativeEvent; 
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; 

public class CWButton extends ButtonCell { 
    private int row = -1; 
    private String alternativevalue; 
    private String exTitle = ""; 

    private String value; 
    private String title = ""; 

    public CWButton() { 
     super(); 

    } 

    @Override 
    public void render(com.google.gwt.cell.client.Cell.Context context, 
      String src, SafeHtmlBuilder sb) { 

     if (row == -1) { 
      sb.appendHtmlConstant("<button title='" + title + "' >" +value+"</button>"); 
      return; 
     } 

     if (row != context.getIndex()) { 

      sb.appendHtmlConstant("<Button disabled='disabled' title='" + title + "' >"+ value+"</button>"); 
     } else { 
      sb.appendHtmlConstant("<button title='" + exTitle + "' >"+ alternativevalue+"</button>"); 
     } 

    } 

    @Override 
    public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, 
      Element parent, String value, NativeEvent event, 
      ValueUpdater<String> valueUpdater) { 

     if (row == -1 || row == context.getIndex()) { 
      super.onBrowserEvent(context, parent, value, event, valueUpdater); 
      return; 
     } 

    } 

    public void setTitle(String title) { 

     this.title = title; 
    } 

    public int getRow() { 
     return row; 
    } 

    public String getExTitle() { 
     return exTitle; 
    } 

    public void setExTitle(String exTitle) { 
     this.exTitle = exTitle; 
    } 

    public void setRow(int row) { 
     this.row = row; 
    } 

    public String getAlternativeValue() { 
     return alternativevalue; 
    } 

    public void setAlternativeValue(String alternativeValue) { 
     this.alternativevalue = alternativeValue; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 
Cuestiones relacionadas