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