gpt4 book ai didi

java - Vaadin 8 使用 Enum 类创建树

转载 作者:行者123 更新时间:2023-12-02 02:12:12 25 4
gpt4 key购买 nike

我对 Vaadin 还很陌生,所以请耐心等待。

我们目前正在从 Vaadin 框架 8.0 迁移到 8.3.2。这样做的原因之一是需要使用树形菜单。由于 8.0 没有树,生成菜单的解决方法是在循环中借助 Enum 类实例化内部 Button 类(用于用户权限控制):

public final class ValoMenuItemButton extends Button {

private static final String STYLE_SELECTED = "selected";

private final DashboardViewType view;

public ValoMenuItemButton(final DashboardViewType view) {
this.view = view;
setPrimaryStyleName("valo-menu-item");
setIcon(view.getIcon());
setCaption(view.getViewName().substring(0, 1).toUpperCase()
+ view.getViewName().substring(1));
DashboardEventBus.register(this);
addClickListener(new ClickListener() {
@Override
public void buttonClick(final ClickEvent event) {
UI.getCurrent().getNavigator()
.navigateTo(view.getViewName());
}
});

}

@Subscribe
public void postViewChange(final PostViewChangeEvent event) {
removeStyleName(STYLE_SELECTED);
if (event.getView() == view) {
addStyleName(STYLE_SELECTED);
}
}
}

枚举类结构是这样构建的:

AUDIT("Receipt Validation", RcptValidation.class, FontAwesome.BAR_CHART_O, false),
AUDIT1("Matching - Receipt not in SYCARDA", RcptNotInSycarda.class, FontAwesome.BAR_CHART_O, false),
AUDIT2("Matching - Receipt not in POS", RcptNotInPos.class, FontAwesome.BAR_CHART_O, false),
AUDIT3("Missing Sequence", MissSequence.class, FontAwesome.BAR_CHART_O, false),
AUDIT4("*Debug Purposes", LineAmtVsTotal.class, FontAwesome.BAR_CHART_O, false);


private DashboardViewType(final String viewName,
final Class<? extends View> viewClass, final Resource icon,
final boolean stateful) {
this.viewName = viewName;
this.viewClass = viewClass;
this.icon = icon;
this.stateful = stateful;
}

到目前为止,我还没有找到任何围绕 v8 框架编写的示例,而我看到的大多数示例代码都是基于 v7 框架的。

我尝试编写类似的内容,但树形子菜单并未按原样显示(我省略了展开和折叠事件,因为可以稍后处理)。

我在树上尝试的代码是这样的:

TreeData <String> treeData = new TreeData(); 
treeData.addRootItems("Dashboard","Sales","Sales Pattern","Top SKUs","Audit");
// The loop starts here (for DashboardViewType view: DashboardViewType.values)
if(enabled){
if(StringUtils.startsWith(view.getViewName(), "SALES")){
if (StringUtils.contains(view.getViewName(),"SALES_PATTERN")){
treeData.addItem( "Sales Pattern", view.getViewName());
}else{ treeData.addItem( "Sales", view.getViewName());
}
}else if (StringUtils.startsWith(view.getViewName(), "TOP_SKUS")){
treeData.addItem( "Top SKUs", view.getViewName());
}else if (StringUtils.startsWith(view.getViewName(), "AUDIT")){
treeData.addItem( "Audit", view.getViewName());
}else if (StringUtils.startsWith(view.getViewName(), "DASHBOARD")){
treeData.addItem( "Dashboard", view.getViewName());
}
DashboardEventBus.register(view);
}
// loop ends here

Tree<String> tree = new Tree<>("Sycarda Dashboard");
tree.setDataProvider(new TreeDataProvider<>(treeData));
tree.setItemIconGenerator(item -> { return FontAwesome.BAR_CHART_O; });
tree.expand("Sales","Sales Pattern","Top SKUs","Audit");
tree.addSelectionListener(e -> new Button.ClickListener() {
@Override public void buttonClick(Button.ClickEvent event) {
DashboardEventBus.register(event);
UI.getCurrent().getNavigator().navigateTo(event.getClass().getName());
}
});

这是 posted originally在 Vaadin 论坛上,但由于没有答案,所以我将其放在这里。如果有任何意见或解决此问题的其他方法,我将不胜感激。

提前致谢。

最佳答案

在 Vaadin 8 中,您可以在添加数据时简单地定义“获取子项”方法。在您的情况下,枚举类应该提供一些类似“getSubItems”的方法,然后您可以将其设置为值提供者。下面的示例以类似的方式显示它,其中“rootItems”与您的顶级枚举实例相同,而 MenuItem 与您的枚举相同。

    static {
rootItems = Arrays.asList(...);
}

@PostConstruct
private void init() {
Tree<MenuItem> tree = new Tree<>();

tree.setItems(rootItems, MenuItem::getSubItems);
}

private class MenuItem {
private String name;
private Resource icon;
private Collection<MenuItem> subItems;

public Collection<MenuItem> getSubItems() {
return subItems;
}

// ... other getter and constructor omitted;
}

关于java - Vaadin 8 使用 Enum 类创建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49850944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com