2013-03-04 131 views
0

我想創建一個登錄系統,使用我創建的用戶類並將多個用戶存儲在ArrayList中。然後,爲了確定用戶輸入到各個字段的內容與特定「用戶」的內容相同,底部會有一個循環來比較兩者。底部的方法返回true或false。如果我沒有以最清楚的方式解釋,我很抱歉,我很抱歉。使用ArrayList登錄系統

我的問題是我的loginAuthorization()方法只返回true當且僅當輸入ArrayList中的第一個元素並且輸入正確。它會忽略添加到ArrayList的所有其他用戶。這個問題顯然有一個「好的」答案,或者我假設,我不明白爲什麼會發生這種情況。如果有人能告訴我我做錯了什麼,那將不勝感激。 :)

我的登錄窗口類:

/** 
    * @author OperatorX© 2013 
    */ 

    package dossierIB; 

    import java.awt.BorderLayout; 
    import java.awt.EventQueue; 
    import java.awt.Toolkit; 

    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.border.EmptyBorder; 
    import net.miginfocom.swing.MigLayout; 
    import javax.swing.JLabel; 
    import java.awt.Component; 
    import javax.swing.Box; 
    import java.awt.Dimension; 

    import javax.swing.ImageIcon; 
    import javax.swing.JOptionPane; 
    import javax.swing.JTextField; 
    import javax.swing.JPasswordField; 
    import javax.swing.JButton; 
    import javax.swing.UIManager; 

    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 
    import java.util.ArrayList; 
    import java.util.Arrays; 

    public class LoginWindow extends JFrame 
    { 
     private JPanel contentPane; 
     private JFrame errorFrame; 
     private JTextField usernameField; 
     private JPasswordField passwordField; 


     /** 
     * Launch the application. 
     */ 
     public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
         LoginWindow frame = new LoginWindow(); 
         frame.setLocationRelativeTo(null); 
         frame.setVisible(true); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 

     /** 
     * Create the frame. 
     */ 
     public LoginWindow() { 
      setResizable(false); 
      setTitle("Employee Authorization"); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setBounds(100, 100, 450, 300); 
      contentPane = new JPanel(); 
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
      setContentPane(contentPane); 
      contentPane.setLayout(new MigLayout("", "[][][][grow][]", "[][][][][][][]")); 

      JPanel bgImagePanel = new JPanel(); 
      ImagePanel backgroundPanel = new ImagePanel(new ImageIcon("C:/Users/OpX/Documents/workspace/Dossier (WBP)/images/testtoptrans.png").getImage()); 
      bgImagePanel.add(backgroundPanel); 
      contentPane.add(bgImagePanel, "cell 0 0 5 1"); 

      Component rigidArea_4 = Box.createRigidArea(new Dimension(20, 20)); 
      contentPane.add(rigidArea_4, "cell 4 1 1 6"); 

      JLabel lblUsername = new JLabel("Username"); 
      contentPane.add(lblUsername, "cell 1 2"); 

      Component rigidArea_1 = Box.createRigidArea(new Dimension(20, 20)); 
      contentPane.add(rigidArea_1, "cell 0 1 1 6"); 

      Component rigidArea_3 = Box.createRigidArea(new Dimension(20, 20)); 
      contentPane.add(rigidArea_3, "cell 2 2 1 3"); 

      usernameField = new JTextField(); 
      contentPane.add(usernameField, "cell 3 2,growx"); 
      usernameField.setColumns(10); 

      Component rigidArea_2 = Box.createRigidArea(new Dimension(20, 20)); 
      contentPane.add(rigidArea_2, "cell 1 3"); 

      JLabel lblPassword = new JLabel("Password"); 
      contentPane.add(lblPassword, "cell 1 4"); 

      passwordField = new JPasswordField(); 
      contentPane.add(passwordField, "cell 3 4,growx"); 

      Component rigidArea_5 = Box.createRigidArea(new Dimension(20, 20)); 
      contentPane.add(rigidArea_5, "cell 1 5 3 1"); 


      JButton btnLogin = new JButton("Login"); 
      btnLogin.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        if(loginAuthorization() == true) 
        { 
         ManageWindow manifest = new ManageWindow(); 
         manifest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         manifest.setSize(697,500); 
         manifest.setLocationRelativeTo(null); 
         manifest.setVisible(true); 

         setVisible(false); 
         dispose(); 
        } 
        else 
         return; 
       } 
      }); 
      contentPane.add(btnLogin, "flowx,cell 3 6,alignx right"); 

      JButton btnCreateAccount = new JButton("Create Account"); 
      btnCreateAccount.setEnabled(false); 
      btnCreateAccount.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 

       } 
      }); 
      contentPane.add(btnCreateAccount, "cell 3 6"); 
     } 

     public Boolean loginAuthorization() 
     { 
      errorFrame = new JFrame(); 
      String username = usernameField.getText(); 
      String password = new String(passwordField.getPassword()); 

      ArrayList<User> users = new ArrayList<User>(); 
      User manager = new User("manager", "gocompany"); 
      User shiftManager = new User("shiftmanager", "goshifts"); 
      User stockBoy = new User("stockboy", "istockshelves"); 
      User cashier = new User("cashier", "trustedwithmoney"); 
      users.add(manager); 
      users.add(shiftManager); 
      users.add(stockBoy); 
      users.add(cashier); 

      for(int i = 0; i < users.size(); i++) 
      { 
       if(users.get(i).getUsername().compareTo(username) == 0 && users.get(i).getPassword().compareTo(password) == 0) 
       { 
        return true; 
       } 

       else 
       { 
        passwordField.setText(""); 
        Toolkit.getDefaultToolkit().beep(); 
        JOptionPane.showMessageDialog(errorFrame, 
          "Could not authorize employee with given username and password.\n\n" + 
          "Please reenter or contact your system administrator.\n\n", 
          "Employee Authorization Failed", 
          JOptionPane.ERROR_MESSAGE); 
        return false; 
       } 
      } 

      return false; 
     } 
    } 

我的用戶等級:

/** 
* @author OperatorX© 2013 
*/ 

package dossierIB; 

public class User 
{ 
    private String user; 
    private String pass; 

    public User(String u, String p) 
    { 
     user = u; 
     pass = p; 
    } 

    public String getUsername() 
    { 
     return user; 
    } 

    public String getPassword() 
    { 
     return pass; 
    } 

    public void setUsername(String username) 
    { 
     this.user = username; 
    } 

    public void setPassword(String password) 
    { 
     this.pass = password; 
    } 

} 
+0

這就是你要去那裏的構造函數的一個例子。除此之外,爲什麼不縮小給你帶來麻煩的代碼的特定部分呢?如果你大大減少了我們將要瀏覽的代碼量,那麼只需要閱讀它就有很多缺陷,並且你可以幫助你自己和那些想回答問題的人。想想[SSCCE](http://sscce.org)。 – Makoto 2013-03-04 06:01:29

+0

如果在第一次迭代期間比較是錯誤的,那麼else部分正在執行。循環無法進行到下一次迭代。 – Rakesh 2013-03-04 06:05:07

+0

@ TierOneOps-我認爲最好使用Hashmap來存儲用戶名和密碼。示例代碼如下。請檢查我的回答 – 2013-03-04 06:09:15

回答

0

移動else分支出來的for循環loginAuthorization()

像這樣的東西應該工作

for (int i = 0; i < users.size(); i++) { 
     if (users.get(i).getUsername().compareTo(username) == 0 && users.get(i).getPassword().compareTo(password) == 0) { 
      return true; 
     } 
    } 
    passwordField.setText(""); 
    Toolkit.getDefaultToolkit().beep(); 
    JOptionPane.showMessageDialog(errorFrame, 
      "Could not authorize employee with given username and password.\n\n" 
      + "Please reenter or contact your system administrator.\n\n", 
      "Employee Authorization Failed", 
      JOptionPane.ERROR_MESSAGE); 
    return false; 
+0

兒子......我知道這是愚蠢的。在添加細節之前,我確實嘗試了你的答案,並做了一個臉掌。感謝您的回答。我會盡快將您的答案標記爲正確答案。再次感謝! :) – BitWar 2013-03-04 06:07:52

1

loginAuthorization()您的returing在第一次自我真或假。

嘗試這種方式,

boolean ret = false; 

    for(int i = 0; i < users.size(); i++) 
       { 
        if(users.get(i).getUsername().compareTo(username) == 0 && users.get(i).getPassword().compareTo(password) == 0) 
        { 
         ret = true; 
break; 

        } 

        else 
        { 
         passwordField.setText(""); 
         Toolkit.getDefaultToolkit().beep(); 
         JOptionPane.showMessageDialog(errorFrame, 
           "Could not authorize employee with given username and password.\n\n" + 
           "Please reenter or contact your system administrator.\n\n", 
           "Employee Authorization Failed", 
           JOptionPane.ERROR_MESSAGE); 

        } 
       } 

       return ret; 
+0

謝謝你。這就是user000001和Rakesh發佈的正確解決方案。如果信貸到期,貸方即到期。謝謝! – BitWar 2013-03-04 06:22:40

1

我認爲它能夠更好地用HashMap程序。下面給出一個示例代碼

import java.util.HashMap; 


public class NewClass { 
    public static void main(String[] args) 
    { 
     HashMap<String,String>unamePass=new HashMap<String, String>(); 
     unamePass.put("user1", "pass1"); 
     unamePass.put("user2", "pass2"); 
     unamePass.put("user3", "pass3"); 
     unamePass.put("user4", "pass4"); 
     if(unamePass.get("user1")!=null) 
     { 
      String password=unamePass.get("user1"); 
      /*compare password with entered password*/ 
     } 
    } 
}