[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 namepassword như hình dưới đây:

JPasswordField in Java swing

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.

JPasswordField in Java swing

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