2013-03-15 2 views
2

прежде всего Im работает на странице отслеживания времени с аутентификацией входа с помощью ldap. Для входа в систему я создал в качестве виджета диалоговое окно вертикальной панели. Моя вертикальная панель содержит два текстовых поля для ввода имени пользователя/пароля и одной кнопки для отправки данных на сервер ldap.GWT - Получить кнопку «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 

     } 
    }); 
} 
} 

Мой Entrypoint

@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

Pass класс слушателя конструктору вида (например, ваш 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()); 
    ... 
} 

Cheers,

+0

ничего себе, как я не пришел к этому решению. Спасибо! – kArvee

+0

Добро пожаловать. Я изложил несколько более сложную настройку, которая обеспечивает лучшее разделение между представлением и контролем, что может быть удобно, когда ваш проект растет. Удачи и счастливого кодирования :-) –

+0

ли интерфейс должен расширять ClickHandler, потому что метод onLogin уже существует? – kArvee

Смежные вопросы