【问题标题】:Vaadin 14 dialog with tabs带有选项卡的 Vaadin 14 对话框
【发布时间】:2020-02-18 08:24:35
【问题描述】:

我想达到以下目标: 对话框包含一个带有标签栏的布局,而标签栏又包含每个标签的组件容器。

private final Map<Tab, Component> tabComponentMap = new LinkedHashMap<>();
public DialogLayout()
    {
        super();
        this.initUI();

        final Tabs tabs             = this.createTabs();
        final Div  contentContainer = new Div();
        this.addComponentAtIndex(1, tabs);
        this.addComponentAtIndex(2, contentContainer);

        tabs.addSelectedChangeListener(e -> {
            contentContainer.removeAll();
            contentContainer.add(this.tabComponentMap.get(e.getSelectedTab()));
        });

        contentContainer.add(this.tabComponentMap.get(tabs.getSelectedTab()));
    }
private Tabs createTabs()
    {
        this.tabComponentMap.put(new Tab("1"), new View1());
        this.tabComponentMap.put(new Tab("2"), new View2());
        this.tabComponentMap.put(new Tab("3"), new View3());
        return new Tabs(this.tabComponentMap.keySet().toArray(new Tab[]{}));
    }

当我打开对话框时,选项卡 1 应该打开(这是默认设置)。每个视图中有两个按钮(后退/下一个)影响选项卡之间的导航。因此,如果我在带有 View1 的 Tab1 中并单击下一步,则会打开带有 View2 的 Tab2,依此类推。如果可能,对话框应保持不变,因此只有选项卡会更改。我如何实现这个目标以及每个视图中的按钮单击事件需要包含什么?我不知道如何从各个视图访问 DialogLayout 中的选项卡。

【问题讨论】:

  • 我可以将标签和new View1(tabs, ...) 中的所有其他标签对象交给 View1 类,但还有其他可能吗?
  • @BasilBourque 忽略滑块功能。我不小心混合了两个想法。我马上改帖
  • 顺便说一下,你可能喜欢 paged-tabs 组件,它包装了与 Vaadin 捆绑的 Tabs 小部件。
  • 您可能正在尝试做的是引导用户通过一系列渐进的步骤来收集选择以实现目标,并且能够返回并更改他们之前的一些选择。这种功能被称为Wizard,这是微软技术作家多年前发明的一种用户界面习惯用法。用户可以理解水平选项卡的任意切换,而没有朝着目标前进的概念。使用带有右下角的“继续”/“返回”按钮的垂直标签,可以将标签移动到标签。

标签: java vaadin


【解决方案1】:

这样的东西会起作用吗?

@Route("dialogs-tabs")
public class DialogContainerTabs extends VerticalLayout {
    public DialogContainerTabs(){
        Dialog dialog=new Dialog();

        Tab tab1 = new Tab("Tab one");
        Div page1 = new Div();
        page1.setText("Page#1");

        Tab tab2 = new Tab("Tab two");
        Div page2 = new Div();
        page2.setText("Page#2");
        page2.setVisible(false);

        Tab tab3 = new Tab("Tab three");
        Div page3 = new Div();
        page3.setText("Page#3");
        page3.setVisible(false);

        Map<Integer, Component> tabsToPages = new HashMap<>();
        tabsToPages.put(0, page1);
        tabsToPages.put(1, page2);
        tabsToPages.put(2, page3);
        Tabs tabs = new Tabs(tab1, tab2, tab3);
        Div pages = new Div(page1, page2, page3);
        Set<Component> pagesShown = Stream.of(page1)
                .collect(Collectors.toSet());

        tabs.addSelectedChangeListener(event -> {
            pagesShown.forEach(page -> page.setVisible(false));
            pagesShown.clear();
            Component selectedPage = tabsToPages.get(tabs.getSelectedIndex());
            selectedPage.setVisible(true);
            pagesShown.add(selectedPage);
        });

        Button back=new Button();
        back.setIcon(VaadinIcon.ARROW_BACKWARD.create());
        dialog.add(back);
        back.addClickListener(e->{
           if(tabs.getSelectedIndex()>0){
               pagesShown.forEach(page -> page.setVisible(false));
               pagesShown.clear();
               tabs.setSelectedIndex(tabs.getSelectedIndex()-1);
               Component selectedPage = tabsToPages.get(tabs.getSelectedIndex());
               selectedPage.setVisible(true);
               pagesShown.add(selectedPage);
           }
           else{
               //Do what you want, maybe navigate to the last one? or NOOP
           }
        });


        Button forward=new Button();
        forward.setIcon(VaadinIcon.ARROW_FORWARD.create());
        dialog.add(forward);
        forward.addClickListener(e->{
            if(tabs.getSelectedIndex()<tabsToPages.size()-1){
                pagesShown.forEach(page -> page.setVisible(false));
                pagesShown.clear();
                tabs.setSelectedIndex(tabs.getSelectedIndex()+1);
                Component selectedPage = tabsToPages.get(tabs.getSelectedIndex());
                selectedPage.setVisible(true);
                pagesShown.add(selectedPage);
            }
            else{
                //Do what you want, maybe navigate to the first one one? or NOOP
            }
        });


        dialog.add(tabs);
        dialog.add(pages);
        dialog.setOpened(true);
        add(dialog);
    }

}

我在选项卡顶部有按钮,但如果你愿意,当然可以将它们放在视图中。 在 Vaadin 14 中,选项卡不包含组件,因此一旦切换选项卡,您应该手动将以前的组件设置为 hidden,将新的组件设置为 visible

结果对话框如下所示:

标签代码直接取自这里:Tabs : Java Examples

附: 它只是一个 POC,这可能与您想要的不完全是 1:1,但是您可以从这里得到一个想法,如何遵循 :) 并且应该重构此代码以不重复使用相同的逻辑三次(在标签监听器和后退/前进按钮)

【讨论】:

  • 我完全被卡住了,完全糊涂了。我试图改变我的方法以获得相同的结果,但我搞砸了。我在我的代码中究竟需要做什么才能仅启用选定的选项卡并通过按钮单击进行导航?到目前为止,我的地图工作正常,因此选项卡链接到正确的内容。
  • 在您的按钮监听器中,您应该添加与addSelectedChangeListener 中相同的代码。我的地图有&lt;Integer,Component&gt;,其中整数代表选项卡的索引,内容是选项卡单击时显示的内容。因此,如果按下“返回”,我将通过setSelectedIndex 导航到(tab -1)。
  • tabComponentMap 更改为Map&lt;Integer, Component&gt;,而不是Tab 添加其位置作为标识符,然后在按钮侦听器中轻松获取内容,因为您可以通过tabs.getSelectedIndex() 获取当前选择的选项卡
  • @nidaav 我会更改它,因为它是查找下一个/上一个选项卡的最简单方法。否则,您需要找出一种方法,如何从地图中获取上一个/下一个选项卡。这将需要额外的工作stackoverflow.com/questions/30099237/…
  • 谢谢!是否可以仅使用按钮而不使用选项卡本身进行导航?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多