[Java Swing] JPasswordField trong Java – JPasswordField in Java
Nội dung
Tạo JPasswordField
Bắt sự kiện và lấy password từ JPasswordField
JPasswordField là đối tượng cho phép chúng ta nhập vào một dòng text giống như JTextField nhưng được ẩn bởi các dấu sao (*) hoặc chấm tròn để tạo nên mật khẩu (password). JPasswordField thường được sử dụng cùng JTextField để tạo nên cặp User name và password như hình dưới đây:
Bây giờ chúng ta sẽ đi tìm hiểu JPasswordField thông qua việc xây dựng chương trình như trên.
Tạo JPasswordField
Chúng ta có một số phương thức khởi tạo JPasswordField thường sử dụng:
– JPasswordField(): Khởi tạo JPasswordField không có text và độ rộng là 0 cột
– JPasswordField(int columns): Khởi tạo JPasswordField không có text và độ rộng là columns cột
– JPasswordField(String text): Khởi tạo JPasswordField vớit text ban đầu
– JPasswordField(String text, int columns): Khởi tạo JPasswordField vớit text ban đầu và rộng columns cột
Trước tiên chúng ta sẽ đi tạo giao diện của chương trình. Giao diện gồm có 1 JPanel là main panel đặt BorderLayout chứa InputPanel và ButtonPanel. InputPanel là một JPanel đặt GridLayout chứa 2 JLabel, 1 JTextField nhập user name, 1 JPasswordField nhập password. ButtonPanel chứa 2 JButton là btnLogin và btnHelp.
package nguyenvanquan7826.JPasswordField; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class MyJPasswordField extends JFrame implements ActionListener { private JTextField tfUserName; private JPasswordField pf; private JButton btnLogin, btnHelp; public MyJPasswordField() { // add main panel to frame add(createMainPanel()); // set display setTitle("JPasswordField"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); setVisible(true); } // create main panel containes input panel and button panel private JPanel createMainPanel() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new EmptyBorder(10, 10, 10, 10)); panel.add(createInputPanel(), BorderLayout.CENTER); panel.add(createButtonPanel(), BorderLayout.PAGE_END); return panel; } // create input panel private JPanel createInputPanel() { int col = 15; // column of JTextField and JPasswordField JPanel panel = new JPanel(new GridLayout(2, 2, 5, 5)); panel.add(createLabel("User name:")); panel.add(tfUserName = createTextField(col)); panel.add(createLabel("Password:")); panel.add(pf = createPasswordField(col)); return panel; } // create button panel with button login and button help private JPanel createButtonPanel() { JPanel panel = new JPanel(); panel.add(btnLogin = createButton("Login")); panel.add(btnHelp = createButton("Help")); return panel; } // create a JLabel with text private JLabel createLabel(String text) { JLabel lb = new JLabel(text); return lb; } // create JTextField with column is col private JTextField createTextField(int col) { JTextField tf = new JTextField(col); return tf; } // create JPasswordField with column is col private JPasswordField createPasswordField(int col) { JPasswordField pf = new JPasswordField(col); return pf; } // create JButton with text is btnName and add ActionListener private JButton createButton(String btnName) { JButton btn = new JButton(btnName); btn.addActionListener(this); return btn; } @Override public void actionPerformed(ActionEvent e) { } public static void main(String[] args) { new MyJPasswordField(); } }
Việc tiếp theo của chúng ta là tạo và bắt sự kiện để lấy user name và password và so sánh với dữ liệu ban đầu để hiển thị thông báo đăng nhập thành công hay thất bại.
Bắt sự kiện và lấy password từ JPasswordField
Để bắt được sự kiện của JPasswordField thì tương tự như đối với JButton, ta cần thực hiện addActionListener cho nó. Và thêm một điểm nữa là ta thường setActionCommand cho nó giống với ActionCommand của btnLogin để sau khi nhập password xong và ấn Enter thì có thể thực hiện quá trình xử lý ngay mà không mất thời gian nhấp vào btnLogin. Sử dụng phương thức getPassword() để lấy password trong JPasswordField. Phương thức này trả về một mảng ký tự là các ký tự trong chuỗi password. Ta có thể sử dụng phương thức getText() nhưng nó được khuyến cáo là không nên dùng nữa.
Ta cần sửa lại phương thức createPasswordField và createButton như sau:
// create JPasswordField with column is col private JPasswordField createPasswordField(String action, int col) { JPasswordField pf = new JPasswordField(col); // set actionCommand for JPasswordField pf.setActionCommand(action); // add action for JPasswordField pf.addActionListener(this); return pf; } // create JButton with text is btnName and add ActionListener private JButton createButton(String action, String btnName) { JButton btn = new JButton(btnName); btn.setActionCommand(action); btn.addActionListener(this); return btn; }
Cuối cùng thì việc còn lại là xử lý dữ liệu mà thôi. Chú ý để hiển thị thông báo chúng ta dùng JOptionPane để hiển thị ra Dialog thông báo.
Code hoàn chỉnh như sau
package nguyenvanquan7826.JPasswordField; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class MyJPasswordField extends JFrame implements ActionListener { private JTextField tfUserName; private JPasswordField pf; private JButton btnLogin, btnHelp; String actionLogin = "login"; String actionHelp = "help"; public MyJPasswordField() { // add main panel to frame add(createMainPanel()); // set display setTitle("JPasswordField"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); setVisible(true); } // create main panel containes input panel and button panel private JPanel createMainPanel() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new EmptyBorder(10, 10, 10, 10)); panel.add(createInputPanel(), BorderLayout.CENTER); panel.add(createButtonPanel(), BorderLayout.PAGE_END); return panel; } // create input panel private JPanel createInputPanel() { int col = 15; // column of JTextField and JPasswordField JPanel panel = new JPanel(new GridLayout(2, 2, 5, 5)); panel.add(createLabel("User name:")); panel.add(tfUserName = createTextField(col)); panel.add(createLabel("Password:")); panel.add(pf = createPasswordField(actionLogin, col)); return panel; } // create button panel with button login and button help private JPanel createButtonPanel() { JPanel panel = new JPanel(); panel.add(btnLogin = createButton(actionLogin, "Login")); panel.add(btnHelp = createButton(actionHelp, "Help")); return panel; } // create a JLabel with text private JLabel createLabel(String text) { JLabel lb = new JLabel(text); return lb; } // create JTextField with column is col private JTextField createTextField(int col) { JTextField tf = new JTextField(col); return tf; } // create JPasswordField with column is col private JPasswordField createPasswordField(String action, int col) { JPasswordField pf = new JPasswordField(col); // set actionCommand for JPasswordField pf.setActionCommand(action); // add action for JPasswordField pf.addActionListener(this); return pf; } // create JButton with text is btnName and add ActionListener private JButton createButton(String action, String btnName) { JButton btn = new JButton(btnName); btn.setActionCommand(action); btn.addActionListener(this); return btn; } // check password private boolean checkData(String inputUserName, char[] inputPassword) { String userName = "nguyenvanquan"; char[] password = { '7', '8', '2', '6' }; return (Arrays.equals(inputPassword, password) && userName .equals(inputUserName)); } @Override public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); // enter on JPasswordField or click button Login to Login if (actionLogin.equals(command)) { if (checkData(tfUserName.getText(), pf.getPassword())) { JOptionPane.showMessageDialog(null, "login success!", "login", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "login failed, Try again!", "login", JOptionPane.ERROR_MESSAGE); } return; } // click button help if (actionHelp.equals(command)) { JOptionPane.showMessageDialog(null, "get user name and password in" + "n" + "cachhoc.net", "help", JOptionPane.INFORMATION_MESSAGE); return; } } public static void main(String[] args) { new MyJPasswordField(); } }
Đọc thêm: class JPasswordField, use JPasswordField
anh ỏi cho em hỏi h em muốn khi đăng nhập nhấn vào login nó sẽ chuyển đên một Frame mới thì phải xử lý như thế nào vậy anh
Bạn khởi tạo Fram mới là được.
câu lệnh xử lý thế nào anh
Dùng new MyFrame().
được rồi anh.em cảm ơn anh nhé
a ơi cho e hỏi là cùng ví dụ trên e có làm thêm 1 Frame tạo tài khoản mới. nhưng khi e bấm nút “Create New Account” thì nó hiện cái Frame đăng ký lên nhưng lại bị đè lên cái Frame đăng nhập .a chỉ e cách khắc phục được không.e cảm ơn.
Nó đè lên là chuyện bình thường mà. Làm sao đâu.
anh cho em hỏi phương thức setActioncommad(); mình truyền vào cho nó 1 string nó hoạt động như thế nảo?
Nó giống như 1 cái key để khi check trong actionPerformed có thể so sánh và biết action là của cái nào khi mà bắt sự kiện cho nhiều cái button.