2012-01-03 55 views
5

我是GWT的新手,但直到現在我一直在取得相當快的進展。GWT CellTable,點擊時禁用ButtonCell

我有一個單元格表,其中大部分是從RPC返回的只讀數據。

我有兩列用戶可以與單元格表中進行交互。一個是TextInputCell,一個是ButtonCell。

當用戶單擊ButtonCell時,我想將該行的TextInputCell中的值發送到RPC。

我有這一切工作。

我無法工作的部分是,當按鈕(ButtonCell)被點擊時,我想禁用該行中的按鈕,直到RPC返回,然後重新啓用它。我還想在RPC返回時清除該行的輸入單元格中的文本。

我無法弄清楚如何獲得被點擊的實際ButtonCell對象的句柄或TextInputCell來處理它們。

任何幫助表示讚賞。

bq

回答

4

問題是沒有被點擊的按鈕的對象。你的ButtonCell創建呈現按鈕的HTML - 整個列中的每個按鈕都由同一個按鈕單元格編寫,但沒有與它們關聯的Java對象。

要直接禁用按鈕,您必須首先創建一個句柄。您可以通過在ButtonCell創建的html中呈現一個id來完成此操作,然後通過DOM中的id獲取元素。

我在類似情況下所做的只是在狀態發生變化時重新呈現整個表格。它不需要那麼長時間,而且你不需要存儲任何引用(你使用CellTable而不是Grid的全部原因)。當你知道你的按鈕應該被禁用時,你只需將其禁用即可。

這兩個建議都需要您對Cell對象進行子類化,以便您可以執行一些自定義渲染。這並不是很困難,但是圍繞操作順序進行包裝可能會讓人困惑。祝你好運!如果你只是想禁用按鈕(而不是空的文本字段),我認爲onBrowserEvent給你一個處理被點擊的Element - 你可能可以使用它來禁用它。

4

我已經經歷了這個問題,但最終我解決了它。

檢查這個代碼

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

}