我先写下代码并在下面问我的问题
以下是我的主要课程
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,这意味着它不是真的必须是我在点击按钮时在视图类中设置的那个?但显然它必须是因为代码的运行方式。但为什么呢?
答案 0 :(得分:0)
您可以看到以下流程
让我们从Application.java
开始。让我们看看方法runApp()
。它确实在事情之下。
View.java
和Controller.java
的对象。Controller.java
implements
LoginListener.java
view.setLoginListener(控制器); //这设置了对象
在View.java对象中的Controller.java,这两个对象都是
与步骤1中创建的相同。现在让我们转到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
的相同对象作为参数传递。
对于这种类型的场景,我建议您记下每种类型创建的对象并连接调用流。希望上面有助于您理解代码。