2016-10-27 2 views
0

J'ai trois classes: User, UserManagement (contenant une liste d'utilisateurs) et LoginController.Appel d'une méthode sur un objet d'une autre classe sans

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?^
    } 
} 

Ce que je voudrais faire est d'appeler la méthode checkUser avec des variables je stockées dans la classe LoginController. Évidemment, je ne veux pas créer un tas d'arraylists chaque fois que je veux vérifier les détails de connexion. Existe-t-il un moyen de faire cela à l'arrayliste dans UserManagement sans créer une nouvelle liste à chaque fois? La dernière méthode en LoginController peut donner un meilleur aperçu de ce que j'aime réaliser.

+0

Votre méthode checkuser seeems défectueux, vous pouvez utiliser la même boucle, que vous avez utilisé dans la méthode listAllUsers, et une fois que vous avez trouvé l'utilisateur , vous devriez casser la boucle avec 'break' ou juste retourner vrai –

Répondre

0

Vous pourriez avoir getters dans votre classe LoginController pour les variables suivantes:

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

public String getLogin() { 
    return login; 
} 

public String getPassword() { 
    return password; 
} 

Ensuite, dans l'autre classe, vous pouvez:

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

LoginController loginController = new LoginController(); 

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

Espérons que cela répond à votre question.

-1

Quelques conseils:

1) Ne pas initialiser le ArrayList dans le constructeur de classe. UserManagemeNT Pensez-y comme "Chaque fois que quelqu'un instancie cette classe, un nouvel arrayliste sera créé ... Est-ce que je veux ça?"

Il n'est pas approprié et aussi l'utilisation inutile de l'espace. La solution ici serait de l'avoir comme une propriété et avoir des getters et setters pour cela. Cela va résoudre votre problème de conception de classe de créer un ArrayList chaque fois que le constructeur est appelé.

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

2) Dans la fonction checkuser(), vous vérifiez l'existence de tous les utilisateurs et leurs mots de passe. Ne fais jamais cela. Au lieu de cela, sélectionnez l'utilisateur et vérifiez s'il existe, seulement alors vérifiez si son mot de passe est correct ou non. Renvoyez le résultat selon le cas (en séparant les erreurs telles que l'utilisateur n'existe pas ou le mot de passe incorrect, etc.).

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

ne fonctionnera pas car les utilisateurs sont définis en tant que variable membre dans la classe UserManagement. Alors que UserManagement.users essaie d'obtenir la variable de classe.

Voici un lien qui vous indique la différence:

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

Quick fix:

1) instancier une instance UserManagemeNT dans votre classe LoginController.

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

    @FXML 
    private TextField login; 

    @FXML 
    private PasswordField password; 

    ScreensController myController; 

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

vous pouvez faire:

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