2011-09-12 21 views
1

我有一個CellTable,需要一個帶有超鏈接和單元格內的onclick處理程序的列。 1日問題,如果我有什麼做錯了:在表格單元格中創建鏈接,並通過點擊它打開浮動彈出框

Column<MyObject, Anchor> linkColumn = new Column<MyObject, Anchor>(
    new AnchorCell()) { 
    @Override 
    public Anchor getValue(final obj) { 
    Anchor link = new Anchor("link"); 
    link.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
     Window.alert("clicked "); 
     } 
    }); 
    return link; 
    } 
}; 
cellTable.addColumn(linkColumn, "link column"); 

...

public class AnchorCell extends AbstractCell<Anchor> { 
@Override 
public void render(Context context, Anchor h, SafeHtmlBuilder sb) { 
    sb.append(SafeHtmlUtils.fromTrustedString(h.toString())); 
} 
} 

- 但點擊鏈接 - 偏偏不信邪

和第二個問題:什麼是更好的方式來打開浮動(基於div左右,而不是分開的瀏覽器窗口)pupup與來自該ClickHandler的文本內容?

回答

1

在CellTable中,您沒有將Anchor小部件添加到表中。你只是添加一些HTML。小部件的功能都不會像通常那樣工作,因爲小部件實際上並不在表中。

您可以重寫onBrowserEvent以獲取單擊單元格等事件。這些事件仍然發生,因爲它們是瀏覽器本地的,並且不需要小部件框架來傳播。我認爲這是達到你想要的效果的最好方法。

+0

我只需要處理表格單元格中鏈接的單擊事件。在普通的html/js中,我有. How can I get it with GWT - adding Anchor widget to the table or coding onBrowserEvent? – yetanothercoder

+0

You can always just add your plain html from the renderer - you don't need a widget. 'sb.append(SafeHtmlUtils.fromTrustedString(""));' –

0

我和你有類似的設置。一個CellTable(現在是一個DataGrid),其中包含超鏈接,但我想在用戶單擊單元格時彈出編輯器小部件,但不會在link-y位上彈出。如果他點擊鏈接,我想要正常的HTML行爲。

使用ClickableTextCell類創建您的列。什麼存儲在單元格中?一個字符串ID到我的用戶記錄數據庫中,其中包括用戶的姓名和電子郵件。當我創建的專欄中,我重寫Render方法,以便將信息呈現爲一個電子郵件鏈接:

Column<RowType, ColumnType> emailColumn = new Column<RowType, ColumnType>(new ClickableTextCell()){ 

    @Override 
    public void render(Context context, T object, SafeHtmlBuilder sb) { 
    /* Code that pulls the value in this column at this row, uses 
    * it to look up the name and the email, then does sb.appendX 
    * to build up the "<a href='emaillink'>name</a>" SafeHtml 
    * construction. 
    */ 
    } 

}; 

其實,我列的一個子類,但你的想法。

Voila,一個活動的HTML鏈接在您的頁面上,但下面是一個可點擊的文本單元格。我發現這比處理瀏覽器事件要容易得多。

我對許多細胞使用相同的結構。下面的ClickableTextCells以及類型特定的渲染代碼,以預期的格式將其呈現給用戶。特別是,我們有一個動態的選擇列表類型的字段 - 也就是說,選擇列表直到發生點擊才知道。標準selectionCell需要在施工時建立一次揀選清單,這正是我所需要的解決方案。因此,而不是一個標準的SelectionCell下拉列表,如果沒有一些嚴肅的工作,這將無法工作**,我使用這種技術。當ClickableTextCell觸發時,我將FieldUpdater設置爲構造一個帶有DataGrid的彈出窗口,此DataGrid列出了此選擇的當前合法值集合(由數據庫的當前狀態確定)。當用戶做出選擇並點擊保存按鈕時,彈出窗口關閉,調用中間件來更新他的選擇,更新後的行數據通過該RPC調用返回,返回的數據用於更新內部客戶端數據庫,這會觸發所有驅動DataGrid的ListDataProviders的更新,它會自動更新主DataGrid(以及屏幕上可能顯示的任何其他DataGrid)。

實際上,我的解決方案已將ClickableTextCell擴展爲DoubleClickableTextCell,因此您需要雙擊才能激活編輯器。當然不是必需的,但它允許用戶在他面前沒有爆炸的彈出窗口的情況下閒逛地點擊網格。

**除了動態方面,這個動態選擇可以是非常長的列表,所以下拉是一個糟糕的選擇。最好呈現一個DataGrid,用戶可以滾動瀏覽,搜索,過濾等等。

+0

thanks, just wonder if there is an OOP way to code link與GWT,但沒有編碼JavaScript內java字符串... – yetanothercoder

相關問題