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

时间:2016-01-24 23:37:04

标签: java vaadin vaadin7 vaadin6

这是我的代码。我想做以下事情。但我在LoginStep1类的getComponent(0)中获得异常。我该如何解决这个问题。 我是vaadin的新人。如果我的方法有误,则需要您的指导。

public class Login extends VerticalLayout implements View {
    public static String viewName = "login";

    public void enter(ViewChangeEvent event) {
        removeAllComponents();
        CustomLayout viewScreen = new CustomLayout("screens/screen-login");

        Component step1 = new LoginStep1().getLoginStep1();

        viewScreen.addComponent(step1, "login-steps");
        addComponent(viewScreen);
    }
}
@SuppressWarnings("serial")
public class LoginStep1 extends Login {
    public Component getLoginStep1() {
        CustomLayout stepScreen = new CustomLayout("components/screens/login-step1");
        Button loginBtn = CommonComponents.getButton("Login", "btn btn-green btn-block");

        loginBtn.addClickListener(new Button.ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                // this line gives me exception.
                CustomLayout currentLayout = (CustomLayout) getComponent(0);
                currentLayout.addComponent(new LoginStep2().getLoginStep2(request, posInfoResponse.getBody()), "login-steps");
            }
        });
    }

    stepScreen.addComponent(loginBtn,"login-btn");
    return stepScreen;
}

它提供以下异常

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

1 个答案:

答案 0 :(得分:0)

有些事情仍然不清楚,因为你没有回答所有评论,所以 我不确定您用作导航器组件导航视图的3个实现中的哪一个(LoginLoginStep1LoginStep2)。但是,看Login& LoginStep1,我可以在当前设计中看到一些您可能想要重新考虑的内容:您正在创建继承类的新实例并在其上调用方法,而不是使用当前实例...

由于LoginStep2的来源不可用,我将尝试涵盖其他两种情况:

1)假设您要导航到Login的实例。

  • 调用enter方法后,会创建LoginStep1的新实例,并将其添加到CustomLayout内的组件列表中。

  • 单击登录按钮时,将在getComponent(0)的新实例上调用LoginStep1,该实例不从Login实例继承用于导航,因此它包含导致您的例外的0个组件

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

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

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

总之,这更可能与基本的java继承概念相关,而不是与Vaadin相关,主要问题可能是LoginStep1

LoginView1