2016-10-27 45 views
0

我有三個類:User,UserManagement(包含用戶arraylist)和LoginController調用另一個類的對象的方法沒有

public class UserManagement { 
    //Create an arraylist that stores users 
    ArrayList<User> users; 

    public UserManagement() { 
     users = new ArrayList<User>(); 
    } 

    public void addUser(String userName, String fullName, String password) { 
     users.add(new User(userName, fullName, password)); 
    } 

    public void listAllUsers() { 
     for (User user : users) { 
      System.out.println(user.printUserInfo()); 
     } 
    } 

    /** 
    * 
    * @param userName username to be searched for 
    * @param password password to be searched for 
    * @ return boolean for check of username/password 
    */ 
    public boolean checkUser(String userName, String password) { 
     int index = 0; 
     boolean searching = true; 
     boolean match = false; 
     while (searching && index < users.size()) { 
      String u = users.get(index).getUsername(); 
      String p = users.get(index).getPassword(); 
      if (u.equals(userName) && p.equals(password)) { 
       //its a match 
       match = true; 
      } 
      else { 
       // continue searching 
       index++; 
      } 
     } 
     return match; 
    } 
} 

public class LoginController implements Initializable, ControlledScreen { 
    @FXML 
    Button loginButton; 

    @FXML 
    private TextField login; 

    @FXML 
    private PasswordField password; 

    ScreensController myController; 

    /** 
    * Initializes the controller class. 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 

    public void setScreenParent(ScreensController screenParent) { 
     myController = screenParent; 
    } 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     UserManagement.users.checkUser(login.getText(), password.getText()); 
     //something like this?^
    } 
} 

我想這樣做是要調用的方法checkUser與我已經存儲在LoginController類變量。顯然,我不想創建一堆arraylist每當我想檢查登錄細節。有沒有一種方法可以在UserManagement中對數組列表進行這樣的操作,而無需每次創建新的數組列表? LoginController中的最後一種方法可以更好地瞭解我喜歡達到的目標。

+0

你checkUser方法seeems有誤,您可以使用相同的for循環,您在listAllUsers方法使用,一旦你找到了用戶,你應該打破「循環」的循環;或者只是返回true –

回答

0

你可以在你的LoginController類干將以下變量:

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

public String getLogin() { 
    return login; 
} 

public String getPassword() { 
    return password; 
} 

然後在你的其他你所能類:

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

LoginController loginController = new LoginController(); 

login = loginController.getLogin(); 
password = loginController.getPassword(); 

希望這回答了你題。

-1

一些提示:

1)不要初始化UserManagement類的構造函數的ArrayList中。可以這樣想:「每次有人實例化該類時,都會創建一個新的陣列列表...我想要那個嗎?」

這是不適當的,也是不必要的空間使用。這裏的解決辦法是讓它像一個屬性,併爲它有getter和setter。 這將解決你的類設計問題,每次構造函數被調用時都會創建一個ArrayList。

private ArratList<User>; {get;set;} 

2)在checkUser()函數,你正在檢查所有用戶和他們的密碼的存在。永遠不要這樣做。 而是選擇用戶並檢查他是否存在,然後檢查他的密碼是否正確。根據情況返回結果(分離錯誤,如用戶不存在或密碼不正確等)。

0
UserManagement.users.checkUser(login.getText(), password.getText()); 

將不起作用,因爲用戶被定義爲UserManagement類中的成員變量。 UserManagement.users試圖獲取類變量。

這裏有一個鏈接,告訴你區別:

http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/

快速修復:

1)在你的LoginController類實例化一個UserManagement實例。

public class LoginController implements Initializable, ControlledScreen { 
    @FXML 
    Button loginButton; 

    @FXML 
    private TextField login; 

    @FXML 
    private PasswordField password; 

    ScreensController myController; 

    UserManagement usrMgmt = new UserManagement(); 
    .... 

那麼你可以做:

@FXML 
    private void handleButtonAction(ActionEvent event) { 
     usrMgmt.checkUser(login.getText(), password.getText()); 
     //something like this?^
    }