2017-07-16 73 views
1

我正在研究Java上的登录系统程序。比较JPasswordfield和JTextField在IF语句中继续去else语句

每次我记下用户和密码,然后按登录,它总是朝着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; 
} 
} 

回答

2

你调用在你创建一个组件代码getText(),因此用户不得不输入任何内容到文本字段的任何机会,在此之前被调用。相反,只应在适当的监听器中调用此方法,例如由用户按下AcceptButton或按下JTextField中的Enter触发的ActionListener。

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

其他问题:

  1. 你是严重过度使用静态的,这意味着需要进行重构,从而不需要静(除主法等),你的代码。
  2. 通常,从密码char []数组中创建一个字符串不是一个好主意,而是要比较char数组。这使得你的密码更安全,虽然在这个简单的学术活动中这不是什么大问题。你仍然应该知道这一点。
  3. 用于将密码文本存储在文本文件中 - 不是很安全(可以想象)。
  4. 大多数Swing登录窗口应该是模态JDialogs而不是JFrames,因为它们呈现的信息在程序进行前必须处理,而模态对话框会暂停程序流程直到它不再可见。
+0

非常感谢您对我的糟糕编码感到抱歉,我仍然在Java的学习过程中。我正在改进我能做的事情,并希望它能起作用。如果阅读你的评论的权利,你告诉我,我应该把InPass和InUser放入Actionlistener,是的,我做过这个之前,但是当我编译它时,它仍然朝着else语句:(。 –

+0

@DannyNguyen:请显示您的更新代码 –

+0

对不起,我还是很新的,但是当我尝试在代码中粘贴时间过长,有没有更好的方法? –