Vaadin navigator不适用于v7.6.7
11.9.3中的示例代码。处理瓦丁之书中的URI片段路径在v7.6.7上不起作用。它在v7.6.6上做得很好。Vaadin navigator不适用于v7.6.7,vaadin,Vaadin,11.9.3中的示例代码。处理瓦丁之书中的URI片段路径在v7.6.7上不起作用。它在v7.6.6上做得很好。如何让它工作?页面。setUriFragmnet可以做一些类似的任务,但它还有另一个问题。我使用UriFragmentChangedListener解决这个问题。 在视图中,使用UI.getCurrent().getPage().setUriFragment(“字符串片段”,true)。一个技巧是使用作为片段字符串的第一个字符 下面是视图处理程序的典型格式 package kr.re.n
如何让它工作?
页面。setUriFragmnet可以做一些类似的任务,但它还有另一个问题。
我使用UriFragmentChangedListener解决这个问题。
在视图中,使用UI.getCurrent().getPage().setUriFragment(“字符串片段”,true)。一个技巧是使用作为片段字符串的第一个字符 下面是视图处理程序的典型格式
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class AdminView extends VerticalLayout implements View {
static int count = 0;
Label label = null;
public AdminView() {
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!admin"))
return;
label.setValue("Admin : " + count + "/" + fragment);
});
setMargin(true);
setSpacing(true);
Button btnAAA = new Button("Admin aaa", e -> {
this.getUI().getPage().setUriFragment("!admin/aaa", true);
});
Button btnBBB = new Button("Admin bbb", e -> {
this.getUI().getPage().setUriFragment("!admin/bbb", true);
});
Button btnQuery = new Button("Goto query", e -> {
TestNavi.navigator.navigateTo("query");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnQuery);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Admin ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Admin EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Admin ENTER finish");
}
}
下面是视图更改效果测试的另一个视图代码
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
public class QueryView extends VerticalLayout implements View {
Label label = null;
static int count = 0;
public QueryView() {
setMargin(true);
setSpacing(true);
UI.getCurrent().getPage().addUriFragmentChangedListener(ev -> {
String fragment = ev.getUriFragment();
if(!fragment.startsWith("!query"))
return;
label.setValue("Query : " + count + "/" + fragment);
});
Button btnAAA = new Button("Query aaa", e -> {
this.getUI().getPage().setUriFragment("!query/aaa", true);
});
Button btnBBB = new Button("Query bbb", e -> {
this.getUI().getPage().setUriFragment("!query/bbb", true);
});
Button btnAdmin = new Button("Goto admin", e -> {
TestNavi.navigator.navigateTo("admin");
});
label = new Label();
addComponent(btnAAA);
addComponent(btnBBB);
addComponent(btnAdmin);
addComponent(label);
}
@Override
public void enter(ViewChangeEvent event) {
System.out.println("Query ENTER begin:" + event.getParameters());
String v = event.getParameters();
if (v.isEmpty())
label.setValue(++count + " : Query EMPTY EVENT");
else
label.setValue(++count + " : " + v);
System.out.println("Query ENTER finish");
}
}
下面是定义导航器对象的主控件UI
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.UI;
@SuppressWarnings("serial")
@Theme("TestNavi")
@Widgetset("kr.re.nsr.secdiv.inseog.navi.testnavi.WidgeTestNavi")
public class TestNavi extends UI {
public static Navigator navigator = null;
private QueryView qv = null;
private AdminView av = null;
private StartView sv = null;
@Override
protected void init(VaadinRequest vaadinRequest) {
navigator = new Navigator(this, this);
qv = new QueryView();
av = new AdminView();
sv = new StartView();
getPage().setTitle("서인석이 시험중입니다.");
navigator.addView("", sv);
navigator.addView("query", qv);
navigator.addView("admin", av);
}
@WebServlet(urlPatterns = "/*", name = "TestNaviServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = TestNavi.class, productionMode = false)
public static class TestNaviServlet extends VaadinServlet {
}
}
以下是起始视图
package kr.re.nsr.secdiv.inseog.navi.testnavi;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class StartView extends VerticalLayout implements View {
public StartView() {
setSizeFull();
Button button = new Button("GO to Main View", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
TestNavi.navigator.navigateTo("query");
}
});
addComponent(button);
setComponentAlignment(button, Alignment.MIDDLE_CENTER);
}
@Override
public void enter(ViewChangeEvent event) {
Notification.show("TestNavi");
}
}
解决方案要点如下所示。1.为每个视图添加URI片段处理程序。
2.对于视图中的状态更改,请使用setUriFragment
3.对于setUriFragment,不要忘记使用!作为第一个字符
4.最后,片段更改处理程序必须检查片段字符串owenership。如果字符串不是您的,请立即返回。另一个处理程序将执行其角色。
这是Vaadin 7.2.7版本发行版的解决方案。在v7.6.6之前,导航在单视图状态更改中表现良好。但是v7.6.7 navigateTo不会为视图中的片段更改触发enter事件。
Vaadin有时可能会恢复进入火灾逻辑。
正如@AndréSchild所建议的,描述您到目前为止所做的工作,并展示相关代码,这样我们就不必猜测您可能做错了什么。您可以通过运行第11.9.3节(瓦丁之书)示例代码查看问题。在Vaadin 7.6.7版本中,代码不起作用!但是有了7.6.6框架,它工作得很好!请键入测试代码并运行它,然后您可以看到问题。我的分析如下:仅在视图屏幕显示时调用视图输入。因此,每个按钮单击侦听器的navigateTo不会激活输入代码,因此整个代码无法运行!在V7.6.8中,问题得到解决。瓦丁可能在v7.6.7上做了一个错误的补丁!