Java 如何在Vaadin中访问派生类中的getComponent

Java 如何在Vaadin中访问派生类中的getComponent,java,vaadin,vaadin7,vaadin6,Java,Vaadin,Vaadin7,Vaadin6,这是我的密码。我想做以下几件事。但我在LoginStep1类的getComponent(0)处遇到异常。我应该如何解决这个问题。 我刚到瓦丁。如果我的方法错误,需要你的指导 公共类登录扩展了VerticalLayout实现视图{ 公共静态字符串viewName=“login”; 公共无效输入(ViewChangeEvent事件){ 移除所有组件(); CustomLayout viewScreen=新的CustomLayout(“屏幕/屏幕登录”); 组件步骤1=新的LoginStep1().g

这是我的密码。我想做以下几件事。但我在LoginStep1类的getComponent(0)处遇到异常。我应该如何解决这个问题。 我刚到瓦丁。如果我的方法错误,需要你的指导

公共类登录扩展了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)
    ,该实例不继承导航中使用的
    login
    实例,因此它包含导致异常的0个组件

2)假设您正在导航到
LoginStep1
的实例,该实例扩展了
Login

  • 当触发enter事件并执行从超类继承的
    enter
    方法时,将创建
    LoginStep1
    的新实例,并将其添加到
    CustomLayout
    中的组件列表中

  • 单击“登录”按钮时,将在
    LoginStep1
    的新实例上调用
    getComponent(0)
    ,该实例与导航中使用的当前
    LoginView1
    实例无关,因此它包含导致异常的0个组件



总之,这更可能与基本java继承概念有关,而不是与Vaadin有关,主要问题可能是
Component step1=new LoginStep1().getLoginStep1();//您遇到的异常是什么?是否有任何解决方案。在进入登录视图之前是否执行了
getLoginStep1()
?从外观上看,您是在实际添加任何组件之前执行该方法的……但是,如果我在同一个类Login中添加getLoginStep1()方法,效果会很好,因为它们位于对象的同一实例中,而不是您现在使用的半循环调用。我假设您在获得错误时正在导航到
登录