2016-10-27 1 views
0

Ich habe drei Klassen: User, UserManagement (enthält eine Arraylist der Benutzer) und LoginController.Aufruf einer Methode für ein Objekt einer anderen Klasse ohne

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

Was würde ich tun möchte, ist die Methode checkUser mit Variablen nennen ich in der LoginController Klasse gespeichert haben. Natürlich möchte ich nicht jede Menge Arraylisten erstellen, wenn ich die Login-Daten überprüfen möchte. Gibt es eine Möglichkeit, dies an die Arraylist in UserManagement zu tun, ohne jedes Mal eine neue Arraylist zu erstellen? Die letzte Methode in LoginController kann besseren Einblick geben, was ich gerne erreiche.

+0

Ihre Checkuser-Methode seeems fehlerhaft zu sein, können Sie die gleiche for-Schleife verwenden könnte, dass Sie in der listAllUsers Methode verwendet, und wenn Sie den Benutzer gefunden haben , du solltest die Schleife mit 'break' unterbrechen. oder gib einfach wahr zurück –

Antwort

0

Sie Getter in Ihrer LoginController Klasse für die folgenden Variablen haben könnte: Sie konnte

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

public String getLogin() { 
    return login; 
} 

public String getPassword() { 
    return password; 
} 

Dann in der anderen Klasse:

@FXML 
private TextField login; 

@FXML 
private PasswordField password; 

LoginController loginController = new LoginController(); 

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

Hoffnung beantwortet dies Ihr Frage.

-1

Ein paar Tipps:

1) Setzen Sie die Arraylist im Konstruktor der Klasse Usermanagement nicht initialisiert werden. Denken Sie daran wie "Jedes Mal, wenn jemand diese Klasse instanziiert, wird eine neue Arraylist erstellt ... Will ich das?"

Es ist nicht angemessen und auch unnötige Nutzung von Speicherplatz.Die Lösung hier wäre, es wie eine Eigenschaft zu haben und Getters und Setter dafür zu haben. Dies löst das Problem des Klassenentwurfs, eine ArrayList bei jedem Aufruf des Konstruktors zu erstellen.

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

2) In der Checkuser() Funktion werden überprüft Sie Existenz aller Benutzer und deren Passwörter. TU das niemals. Wählen Sie stattdessen den Benutzer aus und prüfen Sie, ob er existiert. Überprüfen Sie dann, ob sein Passwort korrekt ist oder nicht. Geben Sie das Ergebnis entsprechend zurück (Trennungsfehler wie Benutzer existiert nicht oder falsches Passwort usw.).

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

wird nicht funktionieren, da Benutzer als Mitgliedvariable in UserManagement-Klasse definiert ist. Während UserManagement.users versucht, die Klassenvariable zu erhalten.

Hier ist ein Link, der Sie den Unterschied sagt:

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

Quick Fix:

1) ein Usermanagement-Instanz in Ihrer LoginController Klasse instanziieren.

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

    @FXML 
    private TextField login; 

    @FXML 
    private PasswordField password; 

    ScreensController myController; 

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

dann können Sie tun:

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