2012-01-13 77 views
0

基本上我想要實現類似於其在GWT documentation風格單個細胞使用CSSResources

定義的細胞色素的東西但是我不想直接指定DIV元素上的樣式,但要從我爲我的CellTable定義的自定義CSSResource分配一個混淆的樣式名。

下面是一些代碼:

我定義的自定義Resources接口爲我CellTable:

public interface CellTableResources extends Resources { 

    @Source({CellTable.Style.DEFAULT_CSS,CellTableStyle.STYLE}) 
    CellTableStyle cellTableStyle(); 

    public interface CellTableStyle extends Style { 
     String STYLE = "CellTable.css"; 

     public Sring coloredCell(); 
    } 
} 

我把它傳遞給我的CellTable的構造函數:

CellTable<XY> table = new CellTable<XY>(15,cellTableResources);

這是我的自定義單元格的樣子。

public class ColorCell extends AbstractCell<String> { 

    interface Templates extends SafeHtmlTemplates { 

     @SafeHtmlTemplates.Template("<div class=\"{0}\">{1}</div>") 
     SafeHtml cell(String classname, SafeHtml value); 
    } 
    private static Templates templates = GWT.create(Templates.class); 

    @Override 
    public void render(Context context, String value, SafeHtmlBuilder sb) { 
     if (value == null) { 
     return; 
     } 
     // how can I access the CSSResources which I pass to the CellTable 
     CellTableResources ressources = ? 
     String className = ressources.cellTableStyle().coloredCell(); 

     SafeHtml safeValue = SafeHtmlUtils.fromString(value); 
     SafeHtml rendered = templates.cell(className, safeValue); 
     sb.append(rendered); 
    } 
    } 

如何訪問我的CellTableRessources,我傳遞給我的CellTable在我的自定義單元格? 這裏是重要的部分:

// how can I access the CSSResources which I pass to the CellTable 
CellTableResources ressources = ? 
String className = ressources.cellTableStyle().coloredCell(); 

我想出的唯一的解決辦法是將CellTableRessources傳遞給我AbstractCell的構造。 沒有更優雅的方式(我已經將它傳遞給CellTable)。

我認爲主要問題是:
「我如何從單元格或列訪問CellTable變量?」

回答

0

'更優雅的方式'的問題是它暗示CellTable自己的樣式在其他地方會很有用,他們可能不會。即使他們爲樣式提供了getter,也會返回一個Style類型的實例,然後您必須將其轉換爲您自己的樣式。

最好是認爲這是你的風格,呈現幾個選項:

  • 請參考身邊,所以你可以從你的細胞內
  • GWT.create的新副本訪問你的單元格中的客戶端軟件包,並調用ensureInjected() - 它只會實際注入一次,所以這真的不是問題,只是一個很好的做法,尤其是如果有人決定不使用表格中的樣式而使用單元格。
  • 最後,將單元格所需的樣式分解到它們自己的clientbundle/cssresource中,並使它們成爲單元本身的一部分。這可以讓你完全分解單元格的依賴關係,甚至可以放入單元格中(而不是單元格或單元格瀏覽器等)。

唯一棘手的部分是,如果對細胞的樣式做依賴於表的樣式,在這種情況下,你正在處理這惱人的依賴是好事 - 它要求你要知道樣式本身的依賴關係。如果你選擇了第三個(我認爲這是最乾淨的)選項,但仍然有這種依賴性,你可以更進一步 - 在你的單元中聲明一個style/clientbundle,但像擴展CellTable的ClientBundle一樣擴展它 - 因爲這些是接口,所以可以製作一個擴展這兩個接口的bundle,並將其提供給每個表和單元。

+0

感謝您的反饋意見。我其實完全忘了鑄造問題。是的,我認爲調用GWT.create()不應該添加任何開銷。我只是認爲它更優雅(代碼方式),如果我可以以某種方式訪問​​CellTable上已經傳遞的實例,但然後我遇到了鑄造問題。 – 2012-01-17 10:41:56

+0

大多數無狀態類變成只是一堆靜態方法,所以GWT.create在第一次調用後沒有花費(適用於i18n,rpc),但CssResource確實有應該調用的ensureInjected()那隻會做一個檢查,看它是否已經添加到dom中。不是免費的,但便宜。 – 2012-01-17 16:39:51