2010-01-19 100 views
3

我想重現使用GWT的電子表格單元格的行爲。我能夠製作一個名爲「單元」的複合小部件,它默認爲「標籤」小部件。當用戶點擊這個小部件時,它變成了一個「TextBox」小部件。在模糊事件中,該小部件再次成爲「標籤」小部件。GWT電子表格單元格

我的問題涉及效率和渲染時間。將我的「單元格」設置爲「文本框」可能最簡單,只需通過CSS(根據它們是否輸入數據)將外觀更改爲用戶。不過,我認爲這會影響渲染時間,所以無論何時輸入不需要,我都會恢復到「標籤」小部件。然而,這種方法的問題在於,我基本上每次用戶需要在「單元格」中輸入任何內容時都會創建一個新的TextBox/Label。

這裏是我的僞代碼(因爲我不是圍繞一個IDE)...

public class Cell extends Composite { 

private SimplePanel sp; 

public Cell() { 
    Label l = new Label(""); 
    sp.add(l); 
} 

private void switchMode() { 
    Widget w = sp.getWidget(); 
    if (w instanceof Label) { 
     // we have a Label, change it to a TextBox 
     String text = ((Label) w).getText(); 
     sp.remove(w); 
     sp.add(new TextBox(text)); 
     // force garbage collection 
     w = null; 
    } else { 
     // we have a TextBox, change it to a Label 
     String text = ((TextBox) w).getText(); 
     sp.remove(w); 
     sp.add(new Label(text)); 
     // force garbage collection 
     w = null; 
    } 
} 

... 

當有對一個文本框或onBlurEvent當有對標籤的onClick事件,開關模式()方法被調用。批評代碼是受歡迎的。

將一個TextBox和Label包含爲Cell類的私有變量,然後根據需要添加或刪除相應的對象會更聰明嗎?

回答

4

我們遇到了類似的問題:高效顯示類似excel的表格(很多行和列,每個單元格就地編輯)。

最終的解決方案是:將表格呈現爲字符串:每個單元格都像文本一樣呈現,全部通過innerHTML呈現。 當用戶使用鼠標或鍵盤選擇一個單元格時,特定隱藏的TextArea出現在所選單元格上(具有相同的大小),並將焦點賦予TextArea。 OnBlur - 輸入的文本返回到單元格,並且TextArea再次隱藏。

我們不使用單元格的小部件。 TextArea僅適用於整個表格。

又見 「有效GWT:開發與谷歌Web工具包一個複雜的,高性能的應用程序」 http://code.google.com/events/io/2009/sessions/EffectiveGwt.html

2

更簡單的方法是將它們都添加到面板(不是simplePanel雖然),並使用setVisable方法來改變可見度。

+0

沒想到的是,卻是的,這可能會更好。我很高興(無論是在我的代碼和頁面渲染),這將是最好的方法嗎? – 2010-01-19 17:36:43

+0

您可以創建2個簡單示例並使用速度跟蹤器來監視它們。 – mrras 2010-01-19 18:18:26

相關問題