2016-03-03 20 views
0

我首先寫的代碼,並要求下面簡單的按鈕代碼使用接口

下面我的問題是我的主類

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可以在真正有沒有不同之處在於我已經在應用類中定義view.setLoginListener(controller)兩個類之間的任何連接設置爲預期LoginFormEvent的控制器類的參數。這隻會讓特定的視圖實例的setLoginListener期待某種LoginListener,這意味着它並不一定是我單擊按鈕時在視圖類中設置的那個。但顯然它必須是因爲這就是代碼的運行方式。但爲什麼?

+0

您將不得不編輯最後一段才能使其易於理解。現在這是一個巨大的磨合句,我無法理解。 – gla3dr

+0

對不起,我可能過於沮喪,我的邏輯是否更有意義? – Jchoi

回答

0

你可以看到流如下

讓我們開始Application.java。讓我們看看方法runApp()。它在下面的事情。

  1. 對象View.javaController.java被創建。
  2. Controller.javaimplementsLoginListener.java view.setLoginListener(controller); //這會將Controller.java中的對象 設置在View.java的對象中,這兩個對象都是 ,與在步驟1中創建的相同。

現在讓我們轉移到View.java

它有一個字段private LoginListener loginListener;和方法public void setLoginListener(LoginListener loginListener)。該方法設置字段loginListener正如我們在上面在步驟2中看到的那樣,loginListener引用了上述步驟1中創建的Controller.java的相同對象。

現在讓我們移動到View.java中定義的public void actionPerformed(ActionEvent e)

它叫fireLoginEvent(new LoginFormEvent(name, password));現在參見LoginFormEvent.java的對象被創建並且它被作爲參數傳遞給方法fireLoginEvent(LoginFormEvent event)

現在正在public void fireLoginEvent(LoginFormEvent event)

它具有代碼:loginListener.loginPerformed(event);。從上面我們知道loginListener唯一Controller.java的是非常對象被稱爲與同一對象(再一個也是唯一一個LoginEvent.java作爲參數傳遞的對象Controller.java 方法public void loginPerformed(LoginFormEvent event)

對於這種類型的場景,我建議您注意每種類型創建的對象並連接呼叫流程。希望以上可以幫助你理解代碼。

+0

嘿,這真是太好了,但是有沒有這樣的事情,比如在整個類「application」中已經預先定義了一個參數時,通過將其傳遞給參數來設置另一個對象中的對象? – Jchoi

+0

另外,我也很好奇abt是LoginListener在setLoginListener中設置的時刻,它顯然已經被編譯器讀取了。但是,當點擊按鈕時,它會再次讀取?就好像在view類中設置this.loginListener = loginListener將其參數設置爲與View類中的loginListener實例相同,而不是參數設置loginListener的實例等於參數?有點逆轉?或者它也可以逆轉工作 – Jchoi

+0

Application.java創建Model.java,View.java和Controller.java的對象。在筆記本中,爲每個對象創建3個圓圈。我們有3個對象,因爲我們使用new關鍵字創建了3個對象。現在我們需要3個引用,分別命名爲model,view和controllers。寫下這3個名字,並將它們分別指向一個圓圈。現在讓我們看看關係,這些由局部變量引用。 Model.java和View.java的對象在其構造函數中傳遞給Controller.java的對象。 Controller.java的對象使用setter方法在View.java的Object中設置。爲這些n'畫線。 –