Я читаю имена пользователей из файла csv в формате
admin1, apple, admin
staff1, orange, staff
когда staff1 находится на новой строке, и независимо от того, сколько строк у меня есть, при входе в систему будет проверяться только последняя строка.
AtomicBoolean found = new AtomicBoolean(false);
btnLogin.setOnAction(e -> {
while (in.hasNextLine()) {
String s = in.nextLine().replaceAll("\\s+", "");
if (name.equals(sArray[0]) && password.equals(sArray[1])) {
lMessage.setText("correct");
openMainForm();
} else if (name.equals("") || password.equals("")) {
lMessage.setText("Please enter a username and password");
} else {
lMessage.setText("Please enter valid credentials");
}
}
});
Я ожидаю, что если в файле будет найдена комбинация имени пользователя и пароля, они смогут войти в систему, а не только в том случае, если имя пользователя и пароль являются последними во времени.
Кроме того, я бы поместил цикл while внутри обработчика setOnAction
.
Самый простой способ - перебрать содержимое файла внутри функции, которая передается setOnAction
, как предложил Картик Сонеджи: вызвать setOnAction
один раз (вне цикла), но сделать то, что он делает, один раз в строке вместо единственный раз
Проблема в том, что вы устанавливаете действие в цикле. То есть один объект действия создается для каждой пары, а затем назначается. Таким образом, после последней итерации действие будет установлено на последний объект, который, очевидно, проверяет последнюю пару имени пользователя и пароля.
петля переводится как что-то вроде,
setOnAction(actionobject1 that checks for admin1, apple, admin)
setOnAction(actionobject2 that checks for staff1, orange, staff)
Это эффективно сохраняет последний созданный объект и проверяет только последнюю пару
Возможно, вы захотите изменить свою логику, чтобы был только один объект действия. А затем проверьте правильность пары логин-пароль.
Что-то вроде этого:
btnLogin.setOnAction(e -> {
while (in.hasNextLine() ) {
// check condition here
// don't forget to break when successful
}
in.close();
});
Кроме того, убедитесь, что вы разорвали цикл, как только будет найдена успешная пара. В противном случае произойдет то же самое.
Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.
Вы перезаписываете действие, которое будет выполняться при нажатии кнопки для каждой из строк, только последнее определенное вами действие будет выполняться при нажатии кнопки.