哟, 我想编写一个简单的Messenger(带有网络和其他东西)来练习我的GUI - 知识。 但是,我遇到了与账户更新有关的发行人。
该程序有4个(对于重要的问题)类。 启动,注册,登录和帐户列表。 开始只需启动注册和登录。 在Register中,您可以将值添加到AccountList中的静态ArrayList。 Login将ArrayList与输入进行比较。 AccountList保存AccountData的静态ArrayList(另一个类)。
现在的问题是,在注册表创建的帐户(ArrayList"值")中无法在登录中使用。 本程序在两个类中创建类帐户列表的对象。
...
AccountList list;
public Register()
{
list = new AccountList();
...
由于Login类将在Register类之后调用,是否应更新静态ArrayList?
这是四个类的代码:
课程开始
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Start extends JFrame implements ActionListener
{
JButton bRegister;
JButton bLogin;
public static void main(String[] args)
{
Start start = new Start();
}
public Start()
{
setSize(400,400);
setResizable(true);
setVisible(true);
setTitle("Start");
setDefaultCloseOperation(EXIT_ON_CLOSE);
FlowLayout mgr = new FlowLayout();
setLayout(mgr);
Container cp = getContentPane();
bRegister = new JButton("Register");
bRegister.addActionListener(this);
cp.add(bRegister);
bLogin = new JButton("Log in");
bLogin.addActionListener(this);
cp.add(bLogin);
}
public void reopen(){
setVisible(true);
}
public void actionPerformed (ActionEvent evt)
{
if (evt.getSource() == bRegister){
Register r = new Register();
setVisible(false);
}
else if(evt.getSource() == bLogin){
Login l = new Login();
setVisible(false);
}
}
}
班级注册:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Register extends JFrame implements ActionListener
{
JLabel lName;
JTextField tName;
JLabel lPassword;
JPasswordField tPassword;
JButton addAcc;
AccountList list;
public Register()
{
list = new AccountList();
Create();
}
private void Create()
{
setSize(400,400);
setResizable(true);
setVisible(true);
setTitle("Register");
setDefaultCloseOperation(EXIT_ON_CLOSE);
FlowLayout mgr = new FlowLayout();
setLayout(mgr);
Container cp = getContentPane();
lName = new JLabel("Name:");
cp.add(lName);
tName = new JTextField(20);
cp.add(tName);
lPassword = new JLabel("Password:");
cp.add(lPassword);
tPassword = new JPasswordField(20);
cp.add(tPassword);
addAcc = new JButton("Confirm");
addAcc.addActionListener(this);
cp.add(addAcc);
}
public void actionPerformed (ActionEvent evt)
{
if (evt.getSource() == addAcc){
String name = tName.getText();
String password = new String(tPassword.getPassword());
list.addAccount(name, password);
setVisible(false);
dispose();
Start start = new Start();
}
}
课程登录:
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Login extends JFrame implements ActionListener
{
JLabel lName;
JTextField tName;
JLabel lPassword;
JPasswordField tPassword;
JButton confirm;
AccountList list;
public Login(){
list = new AccountList();
Create();
}
private void Create()
{
setSize(400,400);
setResizable(true);
setVisible(true);
setTitle("Login");
setDefaultCloseOperation(EXIT_ON_CLOSE);
FlowLayout mgr = new FlowLayout();
setLayout(mgr);
Container cp = getContentPane();
lName = new JLabel("Name:");
cp.add(lName);
tName = new JTextField(20);
cp.add(tName);
lPassword = new JLabel("Password:");
cp.add(lPassword);
tPassword = new JPasswordField(20);
cp.add(tPassword);
confirm = new JButton("Confirm");
confirm.addActionListener(this);
cp.add(confirm);
list.print();
}
public void actionPerformed (ActionEvent evt)
{
if (evt.getSource() == confirm){
String inName = tName.getText();
String inPassword = new String(tPassword.getPassword());
AccountData user = null;
for (AccountData acc : list.list){
if (inName.equals(acc.getName())){
user = acc;
}
}
if (user != null){
if (inPassword != user.getPassword()){
System.out.println("go to inbox");//to change
}
else{
JOptionPane.showMessageDialog(null, "Check the Password", "Wrong Password", JOptionPane.INFORMATION_MESSAGE);
}
}
else{
JOptionPane.showMessageDialog(null, "Check the Name", "Missing Name", JOptionPane.INFORMATION_MESSAGE);
}
}
}
}
类AccountList
import java.util.*;
public class AccountList
{
public static ArrayList<AccountData> list;
public AccountList()
{
list = new ArrayList<AccountData>();
}
public void addAccount(String name, String password)
{
AccountData nAcc = new AccountData(name , password);
list.add(nAcc);
}
public void print(){
System.out.println("on");
for (AccountData acc: list){
System.out.println(acc.getName());
}
}
}
答案 0 :(得分:2)
您的解决方案的根本问题是AccountList的每个实例都会替换任何预先存在的&#39; list&#39;在施工。
最简单的解决方法&#39;只是将列表的构造移动到&#39; list&#39;。
的定义public static ArrayList<AccountData> list = new ArrayList<AccountData>();
这样,AccountList的所有实例都将共享相同的ArrayList对象。
但是,您对AccountList的愿景似乎是单身。我建议您阅读如何正确创建Singleton类。
最后,Singletons很难为客户端类编写适当的单元测试。我建议不要使用静态,不要单身,并切换到像I春天这样的IOC解决方案。