2013-03-15 38 views
2

我正在使用ldap进行登录认证,在时间跟踪页面上工作。 对于登录,我创建了一个将verticalpanel设置为其窗口小部件的对话框。我的verticalpanel包含两个输入用户名/密码的文本框和一个将数据发送到ldap服务器的按钮。GWT - 从Widget首先获取按钮的“addClickHandler”

在模块加载时,弹出对话框并获取登录成功时的时间跟踪内容。

我的问题: “LoginWidget”和“LoginClickHandler”有分开的类,因此我需要获取模块加载的登录按钮来添加“LoginClickHandler”。

处理这个问题的最佳方法是什么? - 因为我知道我的解决方案不是那么好。

LoginWidget类

public class LoginWidget{ 
    private Button loginButton; 
    private DialogBox dialogBox; 
    private TextBox tbxUser; 
    private PasswordTextBox tbxPw; 
    private Label lblUser; 
    private Label lblPW; 
    private Label lblError; 

public LoginWidget(){ 
    dialogBox = new DialogBox(); 
    tbxUser = new TextBox(); 
    tbxPw = new PasswordTextBox(); 
    lblUser = new Label(); 
    lblPW = new Label(); 
    lblError = new Label(); 
    dialogBox.setText("Login"); 
    dialogBox.setAnimationEnabled(true); 
    loginButton = new Button("Login"); 
    // set the id of a widget by accessing its Element 
    loginButton.getElement().setId("closeButton"); 
    final HTML serverResponseLabel = new HTML(); 
    VerticalPanel dialogVPanel = new VerticalPanel(); 
    dialogVPanel.addStyleName("dialogVPanel"); 
    dialogVPanel.add(lblUser); 
    lblUser.setText("User:"); 
    dialogVPanel.add(tbxUser); 
    dialogVPanel.add(lblPW); 
    lblPW.setText("PW:"); 
    dialogVPanel.add(tbxPw); 
    dialogVPanel.add(lblError); 
    dialogVPanel.add(serverResponseLabel); 
    dialogVPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); 
    dialogVPanel.add(loginButton); 
    dialogBox.setWidget(dialogVPanel); 
    dialogBox.show(); 
    dialogBox.center(); 
} 

public Button getLoginButton(){ 
    return loginButton;  
} 

    public DialogBox getDialogBox(){ 
    return dialogBox; 
} 

public TextBox getTbxUser(){ 
    return tbxUser; 
} 

public TextBox getTbxPw(){ 
    return tbxPw; 
} 

public Label getLblError(){ 
    return lblError; 
} 
} 

LoginClickHandler类

public class LoginClickHandler implements ClickHandler { 
/** 
*/ 
private LoginWidget lw; 
private ServiceImplURL serviceImplURL; 
private TimeTracking dtt = new TimeTracking(); 

public LoginClickHandler(ServiceImplURL sIU, LoginWidget _lw){ 
    /** 
    */ 
    this.lw = _lw; 
    this.serviceImplURL = sIU; 
} 

public void onClick(ClickEvent event) { 
    /** 
    */ 
    serviceImplURL.getRpcLdap().authenticate(lw.getTbxPw().getText(), lw.getTbxUser().getText(), new AsyncCallback<Boolean>() { 
     /** 
     */ 
     @Override 
     public void onSuccess(Boolean isLdapAuthOk) { 
      /** 
      */ 
      if(isLdapAuthOk){      
       lw.getDialogBox().hide(); 
       User user = new User(lw.getTbxUser().getText(), lw.getTbxPw().getText()); 
       serviceImplURL.getRpcSession().setUsername(user.getUsername(), new AsyncCallback<Void>() { 

        @Override 
        public void onFailure(Throwable caught) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public void onSuccess(Void result) { 
         // TODO Auto-generated method stub 

        } 
       }); 
       serviceImplURL.getRpcDB().insertUser(user.getUsername(), new AsyncCallback<Void>() { 
        /** 
        */ 
        @Override 
        public void onFailure(Throwable caught) { 
         /* 
         * connection error to implement 
         */          
        } 

        @Override 
        public void onSuccess(Void result) { 
         /* 
         * do nothing 
         */          
        } 
       }); 
       dtt.loadContent(); 
      } 
      else{ 
       lw.getLblError().setStyleName("error"); 
       lw.getLblError().setText("Passwort oder Username falsch!"); 
      }       
     } 

     @Override 
     public void onFailure(Throwable caught) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 
} 

我的入口点

@Override 
    public void onModuleLoad() {  
     /** 
     */ 
     loadLoginWidget(); 

    } 

    /** 
    * Creates the login pop up. 
    */ 
    public void loadLoginWidget(){ 
     /** 
     */ 
     LoginWidget lw = new LoginWidget(); 
     LoginClickHandler lch = new LoginClickHandler(serviceImplURL, lw); 
     lw.getLoginButton().addClickHandler(lch); 
    } 

我已经试图扩展Button,但我不认为它有区别。

回答

0

传递一个监听器类的视图构造(例如,您LoginClickHandler):

public LoginWidget(LoginClickHandler listener) 
{ 
    ... 
    loginButton.addClickHandler(listener) 
    ... 
} 

更一般可能要插的接口定义的操作,并具有LoginClickHandler实现它:

public interface LoginListener 
{ 
    void onLogin(); 
    ... 
} 

public class LoginWidget 
{ 
    public LoginWidget(LoginListener listener) 
    { 
     this.listener = listener; 
     Button loginButton = new Button("Login"); 
     loginButton.addClickHandler(new ClickHandler() 
     { 
      public void onClick(ClickEvent event) { listener.onLogin(); } 
     }); 
    } 
    ... 
} 

,最后

public class LoginClickHandler implements LoginListener 
{ 
    @Override public void onLogin() 
    { 
     serviceImplURL.getRpcLdap()... 
     ... 
    } 
} 

public void loadLoginWidget() 
{ 
    LoginWidget lw = new LoginWidget(new LoginClickHandler()); 
    ... 
} 

干杯,

+0

哇我怎么会不来这个解决方案。谢谢! – kArvee 2013-03-15 09:21:50

+0

不客气。我概述了一个稍微复杂一点的设置,它在视图和控件之间提供了更好的分离,这在您的项目增长时可能非常方便。祝你好运,快乐编码:-) – 2013-03-15 09:24:35

+0

接口是否必须扩展ClickHandler,因为onLogin方法已经存在? – kArvee 2013-03-15 09:50:35