2017-07-16 126 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

對不起,我還是很新的,但是當我嘗試在代碼中粘貼時間過長,有沒有更好的方法? –