我上课了:
public Account(String name, String passwd)
{
this.name = name;
this.passwd = passwd;
}
public String getName()
{
return name;
}
public String getPasswd()
{
return passwd;
}
private String name;
private String passwd;
我也有这门课:
public class CreateAccountAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0)
{
Account newAccount = new Account(GameGUI.textField.getText(), GameGUI.passwordField.getText());
Logger.send("You have created an account with the username, "+newAccount.getName()+".");
}
}
现在,我还有一节课:
public class LogInAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0)
{
String name = GameGUI.textField.getText();
if(GameGUI.passwordField.getText().equalsIgnoreCase(name.getPasswd()))
{
Logger.send("You have logged in.");
loggedIn = true;
}
else
{
Logger.send("Incorrect password.");
}
}
public boolean loggedIn()
{
return this.loggedIn;
}
private boolean loggedIn = false;
}
因此。在第三节课中,我试图在第一堂课中使用name.getPasswd()
函数。但是,name是一个字符串。但我需要使用字符串本身的名称来引用Object。我创建了一个Account leviathan = new Account("Leviathan", "password")
。 name
字符串包含leviathan
。如何将String的内容转换为帐户,leviathan?
答案 0 :(得分:0)
String name = GameGUI.textField.getText();
if(GameGUI.passwordField.getText().equalsIgnoreCase(name.getPasswd()))
但是这不起作用,因为name被声明为String而不是Account,所以你不能在这个问题上请求方法getPasswd()。
要纠正您可以尝试在LogInAction中创建一个方法,例如像
public Account getAccountFromName(String name)
{
// your code to get the account
}
,您的代码将在
中更改 String name = GameGUI.textField.getText();
Account acc = getAccountFromName(name);
if(GameGUI.passwordField.getText().equalsIgnoreCase(acc.getPasswd()))
但是对于所有这些,您必须拥有现有帐户的arrayList。 为此,您必须在CreateAccountAction中更改代码。您需要添加例如accList等等。
答案 1 :(得分:0)
你将无法实现你想要做的事情。您需要创建一个存储和检索某些数据源帐户的服务。然后,您可以调用该服务并按名称加载您要查找的帐户。
有点像这样:
@Override
public void actionPerformed(ActionEvent arg0)
{
AccountService accountService = new AccountService();
Account account = accountService.getAccountByName(GameGUI.textField.getText());
if (account == null) {
Logger.send("Account name does not exist.");
} else {
if(GameGUI.passwordField.getText().equalsIgnoreCase(account.getPasswd()))
{
Logger.send("You have logged in.");
loggedIn = true;
}
else
{
Logger.send("Incorrect password.");
}
}
}
此外,作为提示,存储登录凭据时使用散列算法。这将保护密码在数据源中时。当用户登录时,只需哈希他们尝试登录的密码,然后将其与您在数据源中存储的已经哈希的密码进行比较。
答案 2 :(得分:0)
有很多方法可以达到你想要的效果。通过将每个actionlistener放在自己的类中,你已经使自己变得更难了。
您永远不会将“newAccount”变量保存在任何位置,因此它只会在actionPerformed结束之前存在。要使用GUI处理任何类型的数据,您应该考虑创建一个新类,并将其称为Controller,并将数据保存在那里。然后,您可以将ArrayList作为控制器中的变量,这是当前已知用户的列表(Account-objects列表)。我们称之为accountList。
然后,此Control类具有以下方法:
public static Account getAccountByName(String name){
// do some looping to find the account
}
public static boolean checkIfNameAlreadyExists(){
// make for-loop to check if name is in use
}
public static void addAccount(String name, String passwd){
accountList.add(new Account(name, passwd));
}
Make Control a singleton,让构造函数在创建时创建一个新的ArrayList accountList(或者可能从文件加载它们?)。然后,所有类都可以通过调用Control.addAccount(bla1,bla2)或Control.getAccountByName(“John Prescott”)来访问这些方法。 Joe提到的关于密码散列的要点当然也适用于此。