2

まず、LDAPを使用したログイン認証を使用したタイムトラッキングページで作業しています。ログイン用に、垂直パネルをウィジェットとして設定するダイアログボックスを作成しました。私のverticalpanelには、ユーザー名/パスワードを入力するための2つのテキストボックスと、LDAPサーバーにデータを送信するための1つのボタンが含まれています。

モジュールのロード時にダイアログボックスがポップアップし、ログインが成功したときにコンテンツを追跡する時間を取得します。

私の質問に対して:「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);
    }

私はすでにボタンを拡張しようとしましたが、違いはないと思います。

4

1 に答える 1

0

リスナー クラス (例: your 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() );
    ...
}

乾杯、

于 2013-03-15T09:11:08.670 に答える