使用界面的简单按钮代码

时间:2016-03-03 17:06:30

标签: java swing button

我先写下代码并在下面问我的问题

以下是我的主要课程

public class Application {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            runApp();
        }

    });
}

public static void runApp() {
    Model model = new Model();
    View view = new View(model);

    Controller controller = new Controller(view, model);

    view.setLoginListener(controller);
}

}

以下是我的另一个课程

public class LoginFormEvent {
private String name;
private String password;

public LoginFormEvent(String name, String password) {
    this.name = name;
    this.password = password;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

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

以下是我的控制器类

public class Controller implements LoginListener {
private View view;
private Model model;

public Controller(View view, Model model) {
    this.view = view;
    this.model = model;
}

@Override
public void loginPerformed(LoginFormEvent event) {
    System.out.println("Login event received: " + event.getName() + "; " + event.getPassword());

}


}

下面是我的LoginListener接口

public interface LoginListener {
public void loginPerformed(LoginFormEvent event);
}

最后,下面是我的视图类,我刚刚删除了JFrame代码。

public class View extends JFrame implements ActionListener {

private Model model;
private JButton okButton;
private JTextField nameField;
private JPasswordField passField;

private LoginListener loginListener;

@Override
public void actionPerformed(ActionEvent e) {

    String password = new String(passField.getPassword());
    String name = nameField.getText();

    fireLoginEvent(new LoginFormEvent(name, password));
}

public void setLoginListener(LoginListener loginListener) {
    this.loginListener = loginListener;
}

public void fireLoginEvent(LoginFormEvent event) {
    if(loginListener != null) {
        loginListener.loginPerformed(event);
    }
}

}

这是一个标准按钮协调代码,所以你们可能甚至不需要阅读我的代码来回答我的问题。

所以我知道如何编写这段代码,当我想要一个按钮来调用某个动作时,我就是这样编写的。但是当我试图弄清楚它的逻辑时,要理解为什么'它有效,我很困惑。

因此,当我致电view.setLoginListener(controller)时,我显然期待某种LoginFormEvent。

然后当我点击按钮时,在view课程中构建了new LoginFormEvent

但是当视图类中构造的LoginFormEvent如何被设置为控制器类中预期LoginFormEvent的参数时,除了我之外,两个类之间没有任何连接已在Application类中定义view.setLoginListener(controller)。这只是让特定视图实例的setLoginListener期望某种LoginListener,这意味着它不是真的必须是我在点击按钮时在视图类中设置的那个?但显然它必须是因为代码的运行方式。但为什么呢?

1 个答案:

答案 0 :(得分:0)

您可以看到以下流程

让我们从Application.java开始。让我们看看方法runApp()。它确实在事情之下。

  1. 创建了View.javaController.java的对象。
  2. Controller.java implements LoginListener.java view.setLoginListener(控制器); //这设置了对象 在View.java对象中的Controller.java,这两个对象都是 与步骤1中创建的相同。
  3. 现在让我们转到View.java

    它有一个字段private LoginListener loginListener;和方法public void setLoginListener(LoginListener loginListener)。此方法设置字段loginListener正如我们在上面的步骤2中所见loginListener指的是上面步骤1中创建的Controller.java的相同对象。

    现在让我们转到public void actionPerformed(ActionEvent e)中定义的View.java

    调用fireLoginEvent(new LoginFormEvent(name, password));立即查看LoginFormEvent.java的对象已创建,并作为参数传递给方法fireLoginEvent(LoginFormEvent event)

    现在转到public void fireLoginEvent(LoginFormEvent event)

    它的代码为:loginListener.loginPerformed(event);。从上面我们知道loginListener是指Controller.java唯一对象 方法public void loginPerformed(LoginFormEvent event)在Controller.java的那个对象上被调用,并且(再次只有一个LoginEvent.java的相同对象作为参数传递。

      

    对于这种类型的场景,我建议您记下每种类型创建的对象并连接调用流。希望上面有助于您理解代码。