java - GWT - 从小部件获取按钮的 "addClickHandler"

标签 java gwt button widget handler

首先,我在使用 ldap 进行登录身份验证的时间跟踪页面上工作。 对于登录,我创建了一个对话框,将 verticalpanel 设置为它的小部件。我的垂直面板包含两个用于输入用户名/密码的文本框和一个用于将数据发送到 ldap 服务器的按钮。

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

我的问题: “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,但我认为这没什么区别。

最佳答案

将监听器类(例如您的 LoginClickHandler)传递给 View 构造函数:

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

更一般地说,您可能希望插入一个定义操作的接口(interface)并让 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() );
    ...
}

干杯,

关于java - GWT - 从小部件获取按钮的 "addClickHandler",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15428370/

相关文章:

java - 从 xlsx 文件读取时出现 NullPointerException

java - 如何在使用可变宽度笔画绘制时使绘制路径平滑

java - 保留 GWT 可视化 API 数据表

GWT Tree 小部件吞下箭头键盘事件,这使得 TreeItems 中包含的文本框不响应箭头键

gwt - 如何在 GWT 中禁用菜单栏

java - 每个 Action 监听器的单独类(class)?

python - 使按钮在第二次按下时表现不同 (Python)

java - 如何从 Java 将当前日期设置为 MySQL 日期列?

python - 单击按钮时如何禁用按钮?

java PrintCompilation 输出 : what's the meaning of "made not entrant" and "made zombie"