Java 如何在Vaadin中访问派生类中的getComponent
这是我的密码。我想做以下几件事。但我在LoginStep1类的getComponent(0)处遇到异常。我应该如何解决这个问题。 我刚到瓦丁。如果我的方法错误,需要你的指导Java 如何在Vaadin中访问派生类中的getComponent,java,vaadin,vaadin7,vaadin6,Java,Vaadin,Vaadin7,Vaadin6,这是我的密码。我想做以下几件事。但我在LoginStep1类的getComponent(0)处遇到异常。我应该如何解决这个问题。 我刚到瓦丁。如果我的方法错误,需要你的指导 公共类登录扩展了VerticalLayout实现视图{ 公共静态字符串viewName=“login”; 公共无效输入(ViewChangeEvent事件){ 移除所有组件(); CustomLayout viewScreen=新的CustomLayout(“屏幕/屏幕登录”); 组件步骤1=新的LoginStep1().g
公共类登录扩展了VerticalLayout实现视图{
公共静态字符串viewName=“login”;
公共无效输入(ViewChangeEvent事件){
移除所有组件();
CustomLayout viewScreen=新的CustomLayout(“屏幕/屏幕登录”);
组件步骤1=新的LoginStep1().getLoginStep1();
添加组件(步骤1,“登录步骤”);
添加组件(视图屏幕);
}
}
@SuppressWarnings(“串行”)
公共类LoginStep1扩展了登录{
公共组件getLoginStep1(){
CustomLayout stepScreen=新的CustomLayout(“组件/屏幕/登录-step1”);
按钮loginBtn=CommonComponents.getButton(“登录”、“btn btn绿色btn块”);
loginBtn.addClickListener(新建按钮ClickListener(){
@凌驾
公共作废按钮单击(单击事件){
//这一行给了我一个例外。
CustomLayout currentLayout=(CustomLayout)getComponent(0);
currentLayout.addComponent(新的LoginStep2().getLoginStep2(请求,posInfoResponse.getBody()),“登录步骤”);
}
});
}
添加组件(loginBtn,“loginBtn”);
返回步进屏;
}
它给出了以下例外情况
com.vaadin.server.ServerRpcManager$RpcInvocationException: Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:160)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:79)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:364)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
... 29 more
Caused by: com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick in com.herman.login.LoginStep1$1 failed.
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:528)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1003)
at com.vaadin.ui.Button.fireClick(Button.java:377)
at com.vaadin.ui.Button$1.click(Button.java:54)
... 34 more
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.checkElementIndex(Unknown Source)
at java.util.LinkedList.get(Unknown Source)
at com.vaadin.ui.AbstractOrderedLayout.getComponent(AbstractOrderedLayout.java:414)
at com.herman.login.LoginStep1$1.buttonClick(LoginStep1.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
... 39 more
有些事情还不清楚,因为你还没有回答所有的评论,所以 我不确定您使用的3种实现(
Login
、LoginStep1
或LoginStep2
)中的哪一种作为导航器组件的导航视图。但是,通过查看Login
&LoginStep1
,我可以看到在当前设计中您可能需要重新考虑的一点:您正在创建继承类的新实例,并在其上调用方法,而不是使用当前实例
由于LoginStep2
的源代码不可用,我将尝试介绍其他两种情况:
1)假设您正在导航到Login
的实例
- 调用
方法时,将创建enter
的新实例,并将其添加到LoginStep1
中的组件列表中CustomLayout
- 单击“登录”按钮时,将在
的新实例上调用LoginStep1
,该实例不继承导航中使用的getComponent(0)
实例,因此它包含导致异常的0个组件login
LoginStep1
的实例,该实例扩展了Login
- 当触发enter事件并执行从超类继承的
方法时,将创建enter
的新实例,并将其添加到LoginStep1
中的组件列表中CustomLayout
- 单击“登录”按钮时,将在
的新实例上调用LoginStep1
,该实例与导航中使用的当前getComponent(0)
实例无关,因此它包含导致异常的0个组件LoginView1
总之,这更可能与基本java继承概念有关,而不是与Vaadin有关,主要问题可能是
Component step1=new LoginStep1().getLoginStep1();//您遇到的异常是什么?是否有任何解决方案。在进入登录视图之前是否执行了getLoginStep1()
?从外观上看,您是在实际添加任何组件之前执行该方法的……但是,如果我在同一个类Login中添加getLoginStep1()方法,效果会很好,因为它们位于对象的同一实例中,而不是您现在使用的半循环调用。我假设您在获得错误时正在导航到登录
?