Java Vaadin 14嵌套路由避免在导航时刷新

Java Vaadin 14嵌套路由避免在导航时刷新,java,spring,routes,vaadin,vaadin-flow,Java,Spring,Routes,Vaadin,Vaadin Flow,每次我单击OperationsLayoutFactory中的“添加”按钮时,页面都会刷新并清空 我只想在选项卡第1页的Div中插入“textfieldName” 当我看到空页面时,我可以在浏览器中单击“上一步”。然后,正确添加它。 如何避免加载新的空页面?我的路线有问题吗 添加前,单击 添加后单击并返回浏览器 我的路线布局 -UniversMainUI --OperationsLayout(路由名称:Operations),父级:UniverseMainUI ---AddUniversit

每次我单击OperationsLayoutFactory中的“添加”按钮时,页面都会刷新并清空
我只想在选项卡第1页的Div中插入“textfieldName”
当我看到空页面时,我可以在浏览器中单击“上一步”。然后,正确添加它。
如何避免加载新的空页面?我的路线有问题吗

添加前,单击

添加后单击并返回浏览器


我的路线布局
-UniversMainUI
--OperationsLayout(路由名称:Operations),父级:UniverseMainUI
---AddUniversityLayout(路由名称:justtest),父级:OperationsLayoutFactory

UniversMainUI

@Route("ui")
@RouteAlias("")
@PageTitle("U N I V E R S")
@Theme(value = Lumo.class, variant = Lumo.DARK)
public class UniversMainUI extends Composite<VerticalLayout> implements HasComponents, RouterLayout {

@Autowired
private UniversLogoLayoutFactory universLogoLayoutFactory;

@Autowired
private UniversMenuFactory universMenuFactory;

Component logo;
Component menueLinks;
Component rechtsDatenfeld;
Component studentRemove;

private Div childWrapper = new Div();

public UniversMainUI() {

}

@PostConstruct // autowired-Components sind erst nach Konstruktordurchlauf verfuegbar
private void init() {

    logo = universLogoLayoutFactory.createComponent();
    add(logo);

    menueLinks = universMenuFactory.createComponent();
    add(menueLinks);


    Stream<Component> children = menueLinks.getChildren();
    List<Component> listchildren = children.collect(Collectors.toList());
    ArrayList<Component> arraylistchildren = new ArrayList<Component>(listchildren);

    HorizontalLayout h1 = new HorizontalLayout(menueLinks, childWrapper);
    h1.setHeight("75%");
    h1.setWidth("100%");
    getContent().setSizeFull(); // wichtig fuer Ermoeglichung prozentualer Angabe der Komponentenausmasse
    add(h1);

    for (Component c : arraylistchildren) {
        if (c.getId().get().equals("menueTreeGrid")) // auf Werte vom Typ Optional kann mittels name.get zugegriffen werden
        {
            TreeGrid<Ebene> myTreeGrid = (TreeGrid<Ebene>) arraylistchildren.get(0);
            myTreeGrid.addItemClickListener(event -> {
                if (event.getItem().getBezeichnung().equals(LangStrings.MENU_ADD_STUDENT.toString())) {
                    myTreeGrid.getUI().ifPresent(ui -> ui.navigate("StudentLayout"));
                }
                if (event.getItem().getBezeichnung().equals(LangStrings.MENU_REMOVE_STUDENT.toString())) {
                    myTreeGrid.getUI().ifPresent(ui -> ui.navigate("DeleteStudent"));
                }
                if (event.getItem().getBezeichnung().equals(LangStrings.MENU_OPERATIONS.toString())) {
                    myTreeGrid.getUI().ifPresent(ui -> ui.navigate("Operations"));
                }

                ;
            });
        }
    }
}

@Override
public void showRouterLayoutContent(HasElement content) {
    childWrapper.getElement().appendChild(content.getElement());
}
}
@Route(“ui”)
@RouteAlias(“”)
@页面标题(“U N I V E R S”)
@主题(value=Lumo.class,variant=Lumo.DARK)
公共类UniversMainUI扩展了复合实现HasComponents、RouterLayout{
@自动连线
私有UniversLogoLayoutFactory UniversLogoLayoutFactory;
@自动连线
私立大学工厂大学工厂;
组件标识;
组件菜单链接;
成分rechtsDatenfeld;
构件移动;
private Div childWrapper=new Div();
公共宇宙{
}
@施工后//自连线组件和旧结构
私有void init(){
logo=universLogoLayoutFactory.createComponent();
添加(徽标);
menueLinks=universMenuFactory.createComponent();
添加(菜单链接);
Stream children=menueLinks.getChildren();
List listchildren=children.collect(Collectors.toList());
ArrayList arraylistchildren=新的ArrayList(listchildren);
HorizontalLayout h1=新的HorizontalLayout(菜单链接、子包装);
h1.设定高度(“75%”);
h1.设置宽度(“100%”);
getContent().setSizevel();//将其作为合作伙伴
添加(h1);
for(组件c:arraylistchildren){
if(c.getId().get().equals(“menueTreeGrid”)//auf-Werte-vom-Typ可选kann-mittels-name.get-zugegriffen-werden
{
TreeGrid myTreeGrid=(TreeGrid)arraylistchildren.get(0);
myTreeGrid.addItemClickListener(事件->{
if(event.getItem().getBezeichnung().equals(LangStrings.MENU\u ADD\u STUDENT.toString())){
myTreeGrid.getUI().ifPresent(ui->ui.navigate(“StudentLayout”);
}
if(event.getItem().getBezeichnung().equals(LangStrings.MENU\u REMOVE\u STUDENT.toString()){
myTreeGrid.getUI().ifPresent(ui->ui.navigate(“DeleteStudent”);
}
if(event.getItem().getBezeichnung().equals(LangStrings.MENU\u OPERATIONS.toString())){
myTreeGrid.getUI().ifPresent(ui->ui.navigate(“操作”);
}
;
});
}
}
}
@凌驾
公共无效showRouterLayoutContent(HasElement内容){
childWrapper.getElement().appendChild(content.getElement());
}
}
操作布局

@org.springframework.stereotype.Component // spring-Component und NICHT vaadin-component (aufpassen bei Import)
public class OperationsLayoutFactory extends Composite<VerticalLayout> implements 
UIComponentBuilder,RouterLayout {
@Autowired
AddUniversitaetLayoutFactory addUniversitaetLayoutFactory;
Div childChildWrapper=new Div();

@ParentLayout(UniversMainUI.class)
@Route(value = "Operations", layout = UniversMainUI.class)
private class OperationsLayout extends VerticalLayout {
    Tab tab1;
    Tab tab2;
    Tab tab3;
    Div page1;
    Div page2;
    Div page3;
    Map<Tab, Component> tabsToPages;
    Tabs tabs;
    Div pages;

    Button addButton;

    public OperationsLayout() {
        init().layout();
    }


    public OperationsLayout init() {
        tab1 = new Tab("Hinzufuegen");
        tab2 = new Tab("Alle Anzeigen");
        tab3 = new Tab("Statistiken");

        page1 = new Div();
        page2 = new Div();
        page3 = new Div();



        tabsToPages = new HashMap<>();

        tabs = new Tabs(tab1, tab2, tab3);
        pages = new Div(page1, page2, page3);


        addButton=new Button("Add");
        addButton.addClickListener(e -> {
            page1.getUI().ifPresent(ui -> ui.navigate("justtest"));
        });



        return this;
    }

    public OperationsLayout layout() {

        page1.setText("Erste Seite");
        page1.add(addButton);

        page2.setText("Zweite Seite");
        page2.setVisible(false);

        page3.setText("Dritte Seite");
        page3.setVisible(false);

        tabsToPages.put(tab1, page1);
        tabsToPages.put(tab2, page2);
        tabsToPages.put(tab3, page3);

        pages.setWidth("100%"); // Nutzung verfuegbarer Breite fuer Tabinhalte
        tabs.setWidth("100%");
        tabs.setFlexGrowForEnclosedTabs(1);

        Set<Component> gezeigteSeiten = Stream.of(page1).collect(Collectors.toSet());

        tabs.addSelectedChangeListener(event -> {
            gezeigteSeiten.forEach(page -> page.setVisible(false));
            gezeigteSeiten.clear();
            Component ausgewaehlteSeite = tabsToPages.get(tabs.getSelectedTab());
            ausgewaehlteSeite.setVisible(true);
            gezeigteSeiten.add(ausgewaehlteSeite);
        });

        HorizontalLayout h1=new HorizontalLayout();
        childChildWrapper.setWidth("100%");
        childChildWrapper.setHeight("100%");
        h1.add(childChildWrapper);
        page1.add(h1);
        setSizeFull();
        add(tabs);
        add(pages);
        return this;
    }

}

@Override
public com.vaadin.flow.component.Component createComponent() {

    return new OperationsLayout().init().layout();

}

@Override
public void showRouterLayoutContent(HasElement content) {
    System.out.println("zu childchildwrapper: "+childChildWrapper.getElement()+" wird jetzt hinzugefuegt: "+content.getElement());
    childChildWrapper.getElement().appendChild(content.getElement());
}
}
@org.springframework.stereotype.Component // spring-Component und NICHT vaadin-component (aufpassen bei Import)
public class justTest extends Composite<VerticalLayout> implements UIComponentBuilder { //TODO: Listener einbauen

@Route(value="justtest", layout=OperationsLayoutFactory.class)
private class AddUniversitaetLayout extends Composite<VerticalLayout>{
    TextField textfieldName;

    public AddUniversitaetLayout() {
        // TODO Auto-generated constructor stub
        init().bind().layout();
    }


    public AddUniversitaetLayout init() {

        textfieldName=new TextField("Test erfolgreich!");
        return this;
    }

    public AddUniversitaetLayout bind() {
        return this;
    }

    public AddUniversitaetLayout layout() {


        getContent().add(textfieldName);
        return this;

    }

}

@Override
public com.vaadin.flow.component.Component createComponent() {
    return new AddUniversitaetLayout().init().bind().layout();
}
@org.springframework.stereotype.Component//spring组件和NICHT-vaadin组件(aufpassen-bei导入)
公共类OperationsLayoutFactory扩展了复合实现
UIComponentBuilder,路由布局{
@自动连线
AddUniversitaetLayoutFactory AddUniversitaetLayoutFactory;
Div childwrapper=new Div();
@父布局(UniversMainUI.class)
@路由(value=“Operations”,layout=UniversMainUI.class)
私有类操作布局扩展垂直布局{
表1;
表2;
表3;
分区第1页;
分区第2页;
分区第3页;
地图标签;
标签;
分区网页;
按钮添加按钮;
公共运营布局(){
init().layout();
}
公共操作布局初始化(){
tab1=新选项卡(“Hinzufuegen”);
表2=新表(“Alle Anzigen”);
tab3=新选项卡(“Statistiken”);
page1=新Div();
page2=新Div();
page3=新Div();
tabsToPages=newhashmap();
tabs=新选项卡(tab1、tab2、tab3);
pages=新分区(第1页、第2页、第3页);
addButton=新按钮(“添加”);
addButton.addClickListener(e->{
page1.getUI().ifPresent(ui->ui.navigate(“justtest”);
});
归还这个;
}
公共运营布局布局(){
第1页setText(“Erste Seite”);
page1.添加(添加按钮);
第2页setText(“Zweite Seite”);
第2页设置可见(假);
第3页setText(“Dritte Seite”);
第3页设置可见(假);
tabsToPages.put(tab1,第1页);
tabsToPages.put(tab2,第2页);
tabsToPages.put(tab3,第3页);
pages.setWidth(“100%”;//Nutzung verfuegbarer Breite fuer Tabinhalte
tabs.设置宽度(“100%”);
tabs.setFlexGrowthForEnclosedTabs(1);
Set gezeigteSeiten=Stream.of(第1页).collect(Collectors.toSet());
tabs.addSelectedChangeListener(事件->{
gezeigteSeiten.forEach(page->page.setVisible(false));
gezeigteSeiten.clear();
组件ausgwaehltesseite=tabsToPages.get(tabs.getSelectedTab());
Ausgwaehlteseite.setVisible(真);
gezeigteSeiten.add(Ausgawehltesseite);
});
HorizontalLayout h1=新的HorizontalLayout();
setWidth(“100%”);
childwrapper.setHeight(“100%”);
h1.添加(childwrapper);
第1页添加(h1);
设置大小();
添加(选项卡);
增加(页);
归还这个;
}
}
@凌驾
public com.vaadin.flow.component.component createComponent(){
返回新操作布局().init().layout();
}
@凌驾
公共无效showRouterLayoutContent(HasElement内容){
System.out.println(“zu childwrapper:+childwrapper.getElement()+”wird jetzt hinzugefuegt:+content.getElement());
childwrapper.getElement(
@RoutePrefix(value="bookings")
@ParentLayout(MainUI.class)
@Route(value="booking", layout=BookingsPage.class)
@Route(value="search", layout=BookingsPage.class)
/bookings/booking
/bookings/search
UI.getCurrent().navigate("bookings/search");
@RouteAlias(value="",layout=BookingsPage.class) 
/bookings