2016-01-24 1 views
0

Это мой код. Я хочу сделать следующее. но я получаю исключение в getComponent (0) в классе LoginStep1. Как я должен это решить. Im новый в ваадин. если мой подход не соответствует вашим указаниям.Как получить getComponent в производном классе в 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 
+0

Какое исключение вы получаете? – Morfic

+0

Morfic любое решение. –

+0

Выполняется ли 'getLoginStep1()' перед входом в представление 'Login'? По внешнему виду, вы выполняете этот метод, прежде чем добавлять какие-либо компоненты ... – Morfic

ответ

0

Некоторые вещи до сих пор неясно, так как вы не ответили на все комментарии, так я не уверен, какой из 3-х реализаций (Login, LoginStep1 или LoginStep2) вы используете в качестве вида для навигации с компонентом навигатора. Однако, глядя на Login & LoginStep1, я могу увидеть что-то, что вы можете захотеть пересмотреть в текущем проекте: вы создаете новые экземпляры ваших унаследованных классов и вызывают методы на них вместо использования текущих экземпляров ...

Поскольку источники LoginStep2 не доступны, я буду стараться, чтобы покрыть другие 2 сценария:

1) Предположим, что вы навигации к экземпляру Login.

  • Когда метод вызывается enter, создается новый экземпляр LoginStep1 создается и добавляется в список компонентов внутри CustomLayout.

  • При нажатии на кнопке Войти, то getComponent(0) вызывается на новом экземпляре LoginStep1 который не наследует от Login экземпляра используется в навигации, поэтому он содержит 0 компонент, ведущий к исключению

2) Предположим, вы перешли к экземпляру LoginStep1, который расширяет Login.

  • Когда ввести событие инициируется и enter метод, унаследованные от суперкласса выполняется, создается новый экземпляр LoginStep1 создается и добавляется в список компонентов внутри CustomLayout.

  • При нажатии на кнопке Войти, то getComponent(0) вызывается новый экземпляр LoginStep1, который не имеет ничего общего с текущей LoginView1 экземпляра используется в навигации, поэтому он содержит 0 компонент, ведущий к исключению


в заключение, это более вероятно, связано с основными понятиями наследования Java, чем Vaadin, а основной вопрос может быть Component step1 = new LoginStep1().getLoginStep1(); // <= why create a new instance?

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(); // <= why create a new instance? 

     viewScreen.addComponent(step1, "login-steps"); 
     addComponent(viewScreen); 
    } 
}