【问题标题】:Vaadin MVP button click not workingVaadin MVP按钮单击不起作用
【发布时间】:2017-05-19 13:21:10
【问题描述】:

我是 Vaadin 的新手,我遇到了问题。

我已经尝试过:https://vaadin.com/web/magi/home/-/blogs/model-view-presenter-pattern-with-vaadin 并且示例应用还可以,但是当我尝试创建类似的东西时,它对我不起作用。

我有一个简单的登录表单(登录名、密码字段和一个按钮)。而且按钮有问题。它没有被触发。我可以点击,但动作没有开始。

这是我的代码:

public interface LoginView {
    public void getNotification(String text);

    interface LoginViewListener{
        void loginButtonClick(String login, String password);
    }

    public void addListener(LoginViewListener listener);
}

public class LoginViewImpl extends CustomComponent implements LoginView,Button.ClickListener {

    private TextField loginField = new TextField();
    private PasswordField passwordField = new PasswordField();
    private Label loginLabel = new Label("Login:");
    private Label passwordLabel = new Label("Password:");
    private Button loginButton = new Button("Login");

    LoginViewListener listener;

    public LoginViewImpl(){
        VerticalLayout layout = new VerticalLayout();
        layout.setSizeFull();
        layout.addComponent(loginLabel);
        layout.addComponent(loginField);
        layout.addComponent(passwordLabel);
        layout.addComponent(passwordField);
        layout.addComponent(loginButton);
        setCompositionRoot(layout);
    }

    public void getNotification(String text){
        Notification.show(text);
    }

    @Override
    public void buttonClick(Button.ClickEvent event) {
        listener.loginButtonClick("jeden","dwa");
    }


    public void addListener(LoginViewListener listener) {
        this.listener = listener;
    }
}

public class LoginModel {
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String login;
    private String password;
}


public class LoginPresenter implements LoginView.LoginViewListener {
    LoginModel model;
    LoginView view;

    public LoginPresenter(LoginModel model, LoginView view){
        this.model = model;
        this.view = view;

        view.addListener(this);
    }

    @Override
    public void loginButtonClick(String login, String password) {
        view.getNotification(login + " " + password);
    }
}

@SpringUI(path = "")
public class MainClass extends UI {

    @Override
    protected void init(VaadinRequest request) {
        LoginModel model = new LoginModel();
        LoginViewImpl view = new LoginViewImpl();

        new LoginPresenter(model, view);

        VerticalLayout layout = new VerticalLayout();

        layout.setSizeFull();
        layout.addComponent(view);
        setContent(layout);
    }
}

你能告诉我有什么问题吗? :(

【问题讨论】:

  • addClickListener() 丢失

标签: java vaadin


【解决方案1】:

问题是LoginViewImpl 不监听loginButton 事件。

查看the MVP tutorial中的按钮是如何创建的:

// Add buttons and have them send click events
// to this class
for (String caption: operations)
    layout.addComponent(new Button(caption, this));

注意a Button constructor overload 的用法,它接受ClickListener。这种方式视图实现被注册为按钮点击事件的处理程序。

你应该在你的代码中做类似的事情:

public LoginViewImpl(){
    //skip
    loginButton.addClickListener(this);
    layout.addComponent(loginButton);
    setCompositionRoot(layout);
}     

【讨论】:

  • 点击监听器...非常感谢! :)
猜你喜欢
  • 2023-04-05
  • 2018-05-02
  • 2016-06-07
  • 2014-03-24
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多