【问题标题】:Comparing JPasswordfield and JTextField In IF Statement keeps going to else statement比较 IF 语句中的 JPasswordfield 和 JTextField 继续执行 else 语句
【发布时间】:2017-07-16 14:37:44
【问题描述】:

我正在开发一个 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;
}
}

【问题讨论】:

    标签: java swing jtextfield jpasswordfield


    【解决方案1】:

    您在创建组件的代码中调用getText(),因此在用户有机会在文本字段中输入任何内容之前调用它。相反,该方法只能在适当的侦听器中调用,例如由用户按下接受 JButton 或在 JTextField 中按下回车触发的 ActionListener。

    解决方案:在 ActionListener 中填写您的 inPass 和 inUser 字符串,而不是在创建代码中。

    其他问题:

    1. 您严重过度使用静态,这表明您的代码需要重构,以便不需要静态(除了 main 方法)。
    2. 一般来说,从密码 char[] 数组中创建字符串并不是一个好主意,而是比较 char 数组。这使您的密码更加安全,尽管这在诸如此类的简单学术练习中并不是什么大问题。不过你应该知道这一点。
    3. 在文本文件中存储密码文本也是如此——不是很安全(如您所想)。
    4. 大多数 Swing 登录窗口应该是模态 JDialog 而不是 JFrame,因为它们提供的信息在程序进行之前绝对必须处理,并且模态对话框将暂停程序流程,直到它不再可见。

    【讨论】:

    • 谢谢你,对我糟糕的编码感到抱歉,我还在学习Java。我正在改进我能做的事情,希望它能奏效啊。如果正确阅读您的评论,您告诉我应该将 InPass 和 InUser 放入 Actionlistener,是的,我之前这样做过,但是当我编译它时,它仍然指向 else 语句:(。
    • 对不起,我还是新手,但是当我尝试粘贴代码时,它太长了,有没有更好的方法?
    • @DannyNguyen:不。添加解释代码的文本,该站点将允许它。不要发布废话,而是发布有助于我们理解问题和代码的信息。
    • 好吧,我不知道该怎么做,所以我只是更新了我的代码,如果可以的话?
    • @DannyNguyen:现在,如果您的代码无法正常工作,您需要进行一些调试。打印在 actionperformed 方法中获得的字符串...
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2021-06-17
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多