我正在寻找一种仅在选择选项卡之后而不是之前将内容加载到Vaadin TabSheet上的选项卡中的方法。 Lazy Loading是该术语。

Vaadin 7 Tabsheet的延迟加载并不明显,因为在构建时需要每个选项卡的内容。

我在Vaadin论坛上阅读了主题Strategy for creating lazy load tabs。我确实从Jens Jansson那里了解到,在客户端,Vaadin已经在延迟加载。直到选中选项卡,DOM才会在浏览器中填充。但是我担心减轻服务器端的负载。该线程不能解决该问题。

最佳答案

这是一个完整的例子。以后可以将其封装在专用类中。请注意,每次选择时,选定的选项卡内容都会更改。如果您需要延迟加载但不需要每次都刷新,则可以创建一个布尔加载字段,并使刷新依赖于此。通过提供直观的构造函数参数,您可以直观地进行反击。例如,它对于显示的第一个选项卡很有用。

import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
import com.vaadin.ui.TextField;


public class TablesFrame extends CustomComponent {
private static class LazyTabChangeListener implements SelectedTabChangeListener {
    @Override
    public void selectedTabChange(SelectedTabChangeEvent event) {
        LazyTab tab = (LazyTab) event.getTabSheet().getSelectedTab();
        tab.refresh();
    }
}


private abstract class LazyTab extends CustomComponent {
    public LazyTab() {
        this(false);
    }


    public LazyTab(boolean eager) {
        if (eager) {
            refresh();
        }
    }


    abstract Component build();


    public final void refresh() {
        setCompositionRoot(build());
    }
}

private LazyTab tab1 = new LazyTab(true) {
    @Override
    Component build() {
        return new TextField("1");
    };
};

private LazyTab tab2 = new LazyTab() {
    @Override
    Component build() {
        return new TextField("2");
    };
};


public TablesFrame() {
    TabSheet ts = new TabSheet();
    ts.addSelectedTabChangeListener(new LazyTabChangeListener());
    ts.addTab(tab1, "Tab1");
    ts.addTab(tab2, "Tab2");
    setCompositionRoot(ts);
}
}


更新也可以继承TabSheet的子类。这样,您也可以使用常规选项卡,并具有TabSheet的所有操作。请注意,这里急切的LazyTab和常规选项卡有所不同,因为LazyTabs将重新加载。

import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.TabSheet;


public class LazyTabSheet extends TabSheet {

public LazyTabSheet() {
    addSelectedTabChangeListener(new LazyTabChangeListener());
}


public static abstract class LazyTab extends CustomComponent {
    public LazyTab() {
        this(false);
    }


    public LazyTab(boolean eager) {
        if (eager) {
            refresh();
        }
    }


    public abstract Component build();


    public final void refresh() {
        setCompositionRoot(build());
    }
}


private static class LazyTabChangeListener implements SelectedTabChangeListener {
    @Override
    public void selectedTabChange(SelectedTabChangeEvent event) {
        Component selectedTab = event.getTabSheet().getSelectedTab();
        if (selectedTab instanceof LazyTab) {
            ((LazyTab) selectedTab).refresh();
        }
    }
}

}


如果您想以相同的方式使用手风琴,我不会继承Tabsheet,而是通过装饰器模式实现功能。手风琴继承了TabSheet的子类,因此它应该是可管理的。

09-04 11:13