我的if语句有问题。有一个包含 admin.admin 行的文件。我将线分成点并将其存储在数组中。数组的第一个元素是登录。数组的第一个元素与输入值(代码String inputLogin = textField[0].getText()
中的inputLogin =“admin”)进行比较。我必须得到真实的,但我实际上得到了一个假的
第一个java文件
package classPackage;
import java.awt.*;
import javax.swing.*;
public class ClassAuthorization extends JFrame {
private static final int WIDTH_AUTH = 400;
private static final int HEIGHT_AUTH = 500;
private JLabel[] label = new JLabel[3];
public JTextField[] textField = new JTextField[1];
public JPasswordField[] passwordField = new JPasswordField[1];
protected JButton[] button = new JButton[2];
private String[] text = {"Авторизуйтесь", "Логин:", "Пароль:", "Вход", "Я - участник"};
private Integer[] coordXAuth = {110, 39, 25, 110, 110, 25, 25};
private Integer[] coordYAuth = {20, 120, 170, 125, 175, 225, 285};
private Integer[] widthAuth = {200, 100, 100, 220, 220, 305, 305};
private Integer[] heightAuth = {30, 30, 30, 27, 26, 40, 40};
private Integer[] sizeFont = {24, 22, 22, 18, 18, 18, 18};
public ClassAuthorization() {
setSize(WIDTH_AUTH, HEIGHT_AUTH);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
getContentPane().setLayout(null);
setPanel(panel, 10, 11, 400, 500);
getContentPane().add(panel);
for (int i = 0; i < 3; i++) {
if (i < 1) {
addLabel(i, panel);
addTextField(i, panel);
addPasswordField(i, panel);
addButton(i, panel);
}
else if (i == 1) {
addLabel(i, panel);
addButton(i, panel);
}
else if (i > 1) {
addLabel(i, panel);
}
}
}
private JPanel setPanel (JPanel panel, int x, int y, int width, int height) {
panel.setBounds(x, y, width, height);
panel.setLayout(null);
return panel;
}
private void addLabel(int i, JPanel panel) {
label[i] = new JLabel();
label[i].setText(text[i]);
label[i].setBounds(coordXAuth[i], coordYAuth[i], widthAuth[i], heightAuth[i]);
label[i].setFont(new Font("Segoe UI Light", Font.PLAIN, sizeFont[i]));
panel.add(label[i]);
}
private void addTextField(int i, JPanel panel) {
textField[i] = new JTextField();
textField[i].setBounds(coordXAuth[i + 3], coordYAuth[i + 3], widthAuth[i + 3], heightAuth[i + 3]);
textField[i].setFont(new Font("Segoe UI Light", Font.PLAIN, sizeFont[i + 3]));
panel.add(textField[i]);
}
private void addPasswordField(int i, JPanel panel) {
passwordField[i] = new JPasswordField();
passwordField[i].setBounds(coordXAuth[i + 4], coordYAuth[i + 4], widthAuth[i + 4], heightAuth[i + 4]);
panel.add(passwordField[i]);
}
private void addButton(int i, JPanel panel) {
button[i] = new JButton();
button[i].setText(text[i + 3]);
button[i].setBounds(coordXAuth[i + 5], coordYAuth[i + 5], widthAuth[i + 5], heightAuth[i + 5]);
button[i].setFont(new Font("Segoe UI Light", Font.PLAIN, sizeFont[i + 5]));
panel.add(button[i]);
}
}
第二个java文件
package mainPackage;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import javax.swing.JButton;
import classPackage.ClassAuthorization;
public class Authorization extends ClassAuthorization {
private String path = "src/putFile/Account.txt";
public Authorization() {
checkAccess(button[0]);
}
private void checkAccess(JButton button) {
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
File file = new File(path);
Scanner scanner;
try {
scanner = new Scanner(file);
do {
String account = scanner.nextLine();
String[] parts = account.split("\\.");
String login = parts[0].trim();
String pass = parts[1];
char [] password = pass.toCharArray();
String inputLogin = textField[0].getText();
char[] inputPassword = passwordField[0].getPassword();
System.out.println(inputPassword);
if (inputLogin.equals(login) == true && Arrays.equals(password, inputPassword) == true) { // BAD
System.out.println("GOOD");
break;
}
else {
System.out.println("BAD");
}
} while (scanner.hasNextLine() == true);
}
catch (FileNotFoundException NotFoundFile) {
NotFoundFile.printStackTrace();
}
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Authorization frame = new Authorization();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
Account.txt
admin.admin
答案 0 :(得分:2)
在我真正回答你的问题之前,我必须提出一些建议:
避免扩展JFrame
,因为JFrame
是一个严格的容器,而是为JPanel
构建GUI并实例化JFrame
,请在以下位置获取答案: Extends JFrame vs. creating it inside the program作为参考
为什么要为这些行创建一个完整的数组:
public JTextField[] textField = new JTextField[1];
public JPasswordField[] passwordField = new JPasswordField[1];
如果您要使用单个元素,则不需要数组。
以下几行对我没有意义,因为当你可以使用原语Integer
时,不需要将数字包装为int
,这会影响程序的性能。
private Integer[] coordXAuth = {110, 39, 25, 110, 110, 25, 25};
private Integer[] coordYAuth = {20, 120, 170, 125, 175, 225, 285};
getContentPane().setLayout(null);
停止使用null-layout
!请仔细阅读如何使用不同的layout managers,您可以将它们组合起来并创建很酷的GUI。
Swing旨在使用它们,因为它必须处理不同的OS,PLAF,屏幕尺寸和分辨率,像素完美的GUI是一种幻觉,here是使用它们时会发生什么的一个例子。 / p>
有关详细信息,请参阅:Why is it frowned upon to use a null layout in Swing?,What's wrong with the Null Layout in Java?和Null layout is evil。
立即停止使用setLayout(null)
和setBounds(...)
,setLocation(...)
方法!
这些行:
while (scanner.hasNextLine() == true);
if (inputLogin.equals(login) == true && Arrays.equals(password, inputPassword) == true) { // BAD
可能是这样写的:
while (scanner.hasNextLine()); //Removed == true
if (inputLogin.equals(login) && Arrays.equals(password, inputPassword)) { //Removed == true
因为这些方法已经返回一个布尔值,所以,没有必要将布尔值与另一个布尔值进行比较,这与if (true == true)
相同,为什么不是if (true)
?它更容易阅读和理解。
但是,我必须祝贺你把你的节目放在了EDT上。
现在,在我们说完上述建议之后,让我们继续讨论该计划......它对我来说很好:
这是我运行它时的控制台输出:
admin
GOOD
所以,问题可能在你的文件上,我建议你再写一次吗?
以下是使用以下方法生成类似输出的示例:
GridBagLayout
。代码:
GridLayout
正如您所看到的,代码很短,它是完整的,因为您可以复制粘贴它并通过单个修改(文件路径)查看输出,它是可验证的(它显示与下面相同的输出),这就是你的当你被要求做MCVE时,我希望这样做。没有发布相关代码,好吧,我无法写出前五个建议:)
我的输出与你的输出,两者都非常相似,只是更改字体,它应该看起来像之前......