比较 IF 语句中的 JPasswordfield 和 JTextField 继续转到 else 语句
Comparing JPasswordfield and JTextField In IF Statement keeps going to else statement
我正在 Java 上开发登录系统程序。
每次我写下用户名和密码并按登录时,它总是转到 else 语句。我确实将 passwordfield
变成了一个字符串,但它仍然不起作用。
代码如下:
public static void main(String[] args)
{
JFrame frame = new JFrame("Login");
frame.setLayout(new BorderLayout());
frame.add(panelC(), BorderLayout.CENTER);
frame.add(panelN(), BorderLayout.NORTH);
//frame.add(panelW(), BorderLayout.WEST);
//frame.add(panelE(), BorderLayout.EAST);
frame.add(panelS(), BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
public static JPanel panelC()
{
JPanel panel = new JPanel();
label1 = new JLabel("Username");
label2 = new JLabel("Password");
field1 = new JTextField(10);
pass = new JPasswordField(10);
panel.add(label1);
panel.add(field1);
panel.add(label2);
panel.add(pass);
return panel;
}
public static JPanel panelN()
{
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0,25));
return panel;
}
public static JPanel panelS()
{
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0,5));
button1 = new JButton("Login");
JLabel test = new JLabel();
JLabel test2 = new JLabel();
JLabel test3 = new JLabel();
JLabel test4 = new JLabel();
panel.add(test);
panel.add(test2);
panel.add(test3);
panel.add(test4);
panel.add(button1);
char[] p = pass.getPassword();
button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent f)
{
try
{
Scanner scan = new Scanner (new File("Logins.txt"));
String user = scan.nextLine();
String pass = scan.nextLine();
String inPass = new String(p);
String inUser = field1.getText();
while (scan.hasNextLine())
{
if (inUser.equals(user) && inPass.equals(pass))
{
System.out.println("Granted");
break;
}
else
{
user = scan.nextLine();
pass = scan.nextLine();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
return panel;
}
}
您在创建组件的代码中调用了 getText()
,因此在用户有机会在文本字段中输入任何内容之前就调用了它。相反,只能从适当的侦听器中调用此方法,例如由用户按下接受 JButton 或在 JTextField 中按下回车键触发的 ActionListener。
解决方案:在 ActionListener 中填写您的 inPass 和 inUser 字符串,而不是在创建代码中。
其他问题:
- 您严重过度使用静态,这表明您的代码需要重构,以便不需要静态(除了 main 方法)。
- 一般来说,从您的密码 char[] 数组中创建一个 String 不是一个好主意,而是比较 char 数组。这使您的密码更加安全,尽管这在像这样的简单学术练习中并不是什么大不了的事。这个你还是应该知道的。
- 将密码文本存储在文本文件中也是如此——不是很安全(如您所想)。
- 大多数 Swing 登录 windows 应该是模态 JDialog 而不是 JFrames,因为它们提供了在程序运行之前绝对必须处理的信息,并且模态对话框将停止程序流,直到它不再可见。
我正在 Java 上开发登录系统程序。
每次我写下用户名和密码并按登录时,它总是转到 else 语句。我确实将 passwordfield
变成了一个字符串,但它仍然不起作用。
代码如下:
public static void main(String[] args)
{
JFrame frame = new JFrame("Login");
frame.setLayout(new BorderLayout());
frame.add(panelC(), BorderLayout.CENTER);
frame.add(panelN(), BorderLayout.NORTH);
//frame.add(panelW(), BorderLayout.WEST);
//frame.add(panelE(), BorderLayout.EAST);
frame.add(panelS(), BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
public static JPanel panelC()
{
JPanel panel = new JPanel();
label1 = new JLabel("Username");
label2 = new JLabel("Password");
field1 = new JTextField(10);
pass = new JPasswordField(10);
panel.add(label1);
panel.add(field1);
panel.add(label2);
panel.add(pass);
return panel;
}
public static JPanel panelN()
{
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0,25));
return panel;
}
public static JPanel panelS()
{
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0,5));
button1 = new JButton("Login");
JLabel test = new JLabel();
JLabel test2 = new JLabel();
JLabel test3 = new JLabel();
JLabel test4 = new JLabel();
panel.add(test);
panel.add(test2);
panel.add(test3);
panel.add(test4);
panel.add(button1);
char[] p = pass.getPassword();
button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent f)
{
try
{
Scanner scan = new Scanner (new File("Logins.txt"));
String user = scan.nextLine();
String pass = scan.nextLine();
String inPass = new String(p);
String inUser = field1.getText();
while (scan.hasNextLine())
{
if (inUser.equals(user) && inPass.equals(pass))
{
System.out.println("Granted");
break;
}
else
{
user = scan.nextLine();
pass = scan.nextLine();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
return panel;
}
}
您在创建组件的代码中调用了 getText()
,因此在用户有机会在文本字段中输入任何内容之前就调用了它。相反,只能从适当的侦听器中调用此方法,例如由用户按下接受 JButton 或在 JTextField 中按下回车键触发的 ActionListener。
解决方案:在 ActionListener 中填写您的 inPass 和 inUser 字符串,而不是在创建代码中。
其他问题:
- 您严重过度使用静态,这表明您的代码需要重构,以便不需要静态(除了 main 方法)。
- 一般来说,从您的密码 char[] 数组中创建一个 String 不是一个好主意,而是比较 char 数组。这使您的密码更加安全,尽管这在像这样的简单学术练习中并不是什么大不了的事。这个你还是应该知道的。
- 将密码文本存储在文本文件中也是如此——不是很安全(如您所想)。
- 大多数 Swing 登录 windows 应该是模态 JDialog 而不是 JFrames,因为它们提供了在程序运行之前绝对必须处理的信息,并且模态对话框将停止程序流,直到它不再可见。