GWT电子表格单元格

时间:2010-01-19 15:14:53

标签: java gwt cell composite

我正在尝试使用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类的私有变量包含在内,然后根据需要添加或删除相应的对象会更聪明吗?

2 个答案:

答案 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方法来改变可见性。