我正在尝试使用GWT重现电子表格单元格的行为。我可以创建一个名为"Cell“的复合小部件,默认情况下它是一个"Label”小部件。当用户单击此小部件时,它将变成一个"TextBox“小部件。在模糊事件中,小部件再次变成“标签”小部件。
我的问题涉及到效率和渲染时间。最简单的方法可能就是将我的"Cell“设为"TextBox”,然后通过CSS改变用户的外观(根据用户是否正在输入数据)。但是,我认为这会影响渲染时间,所以每当不需要输入时,我都会恢复使用"Label“小部件。然而,这种方法的问题是,每次用户需要在"Cell“中输入任何内容时,我基本上都会创建一个新的文本框/标签。
下面是我的伪代码(因为我没有使用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;
}
}
...当TextBox上有onBlurEvent或Label上有onClick事件时,将调用switchMode()方法。欢迎对代码进行评论。
相反,包含一个TextBox并将其标记为Cell类的私有变量,然后根据需要添加或删除相应的对象是不是更聪明?
发布于 2010-01-20 18:43:47
我们遇到了类似的问题:类似excel的表格的高效显示(许多行和列,每个单元格都是可就地编辑的)。
最终的解决方案是:将表格呈现为字符串:每个单元格都呈现为文本,所有内容都通过innerHTML进行呈现。当用户使用鼠标或键盘选择一个单元格时,选定的单元格(具有相同大小)上会出现特殊的隐藏TextArea,并且焦点将提供给TextArea。OnBlur -输入的文本返回到单元格,并且TextArea再次隐藏。
我们不对单元格使用小部件。对于整个表,TextArea只有一个。
另请参阅“有效的GWT:使用Google Web Toolkit开发复杂、高性能的应用程序”http://code.google.com/events/io/2009/sessions/EffectiveGwt.html
发布于 2010-01-20 01:28:06
一种更简单的方法是将它们都添加到您的面板中(虽然不是simplePanel ),并使用setVisable方法来改变可视性。
https://stackoverflow.com/questions/2094469
复制相似问题