Tạo ô nhập mật khẩu với JPasswordField trong Swing

JPasswordField là một component trong Java Swing cho phép nhập và chỉnh sữa một đoạn văn bản trên cùng một dòng tuy nhiên những gì người dùng nhập sẽ bị ẩn khởi màn hình ứng dụng.

JPasswordField là một công cụ khá hữu hiệu để bạn có thể làm một ô nhập mật khẩu đăng nhập, đăng ký người dùng, hay những thông tin quan trọng như mã số thẻ ngân hàng, CVV/CVC, etc.

Một điểm lưu ý nữa là JPasswordField thừa kế từ JTextField nên nó có hầu hết các tính năng của thằng cha, các bạn có thể tham khảo qua JTextField để có cái nhìn tổng quát hơn.

Khởi tạo JPasswordField

JPasswordField cung cấp một số constructor hỗ trợ khởi tạo một đối tượng JPasswordField:

  • JPasswordField() – Khởi tạo một JPasswordField rỗng.
  • JPasswordField(int columns) – Khởi tạo một JPasswordField rỗng với số lượng cột được chỉ định, số lượng cột này được dùng để tính toán chiều rộng của JTextField.
  • JPasswordField(String Password, int columns) – Khởi tạo một JPasswordField với giá trị ban đầu là Password và số lượng cột được chỉ định.
  • JPasswordField(Document doc, String Password, int columns) –  Khởi tạo JPasswordField sử dụng mô hình lưu trữ văn bản đã cho và số cột nhất định.

Một số hàm thường xuyên sử dụng trong JPasswordField:

  • char getEchoChar() – Trả về ký tự được dùng để tượng trưng cho các ký tự thay thế gía trị thật bên dưới.
  • setEchoChar(char c) – Gán ký tự được dùng để thay thế giá trị thật.
  • String getPassword() –  Lấy giá trị thật mà người dùng nhập trong JPasswordTextField.
  • String getText() –  Lấy giá trị thật mà người dùng nhập trong JPasswordTextField

Ví dụ tạo Form Login

Ví dụ sau mình sẽ tạo một form login gồm Username, và Password. Trong đó dữ liệu của Password của người dùng nhập vào sẽ bị ẩn khỏi màn hình và xuất ra màn hình console.

import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import java.awt.*;

public class Main{

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setLayout(new GridLayout(2, 2));
        JLabel label = new JLabel("User Name:", SwingConstants.LEFT);
        JLabel label2 = new JLabel("Password:", SwingConstants.LEFT);
        JTextField userNameField = new JTextField(20);
        JPasswordField passwordField = new JPasswordField();

        // Xu ly su kien moi khi nguoi dung nhap mat khau
        passwordField.addCaretListener(new CaretListener() {
            @Override
            public void caretUpdate(CaretEvent e) {
                System.out.println("Mat khau:" + String.valueOf(passwordField.getPassword()));
            }
        });

        frame.add(label);
        frame.add(userNameField);
        frame.add(label2);
        frame.add(passwordField);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Màn hình console sẽ hiển thị

Mat khau:
Mat khau:1
Mat khau:12
Mat khau:123
Mat khau:1231
Mat khau:12312
Mat khau:123123

Đổi ký tự đại diện trong JPasswordField

Mặc định ký tự đại diện trong JPasswordField dùng để ẩn nội dung thật là dấu chấm như trên, giả sử chúng ta muốn đổi nó thành ‘@’ thì có thể sử dụng setEchoChar() method.

import javax.swing.*;
import java.awt.*;

public class Main{

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setLayout(new GridLayout(2, 2));
        JLabel label = new JLabel("User Name:", SwingConstants.LEFT);
        JLabel label2 = new JLabel("Password:", SwingConstants.LEFT);
        JTextField userNameField = new JTextField(20);
        JPasswordField passwordField = new JPasswordField();
        passwordField.setEchoChar('@');
        frame.add(label);
        frame.add(userNameField);
        frame.add(label2);
        frame.add(passwordField);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Xử lý sự kiện trong JPasswordTextField

Chúng ta có thể xử lý sự kiện khi người dùng thao tác trên JPasswordTextField như người dùng đang nhập liệu với keyPress đang nhấn, keyTyped đã gõ và keyReleased hoàn tất gõ với addKeyListener() method.

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Main{

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setLayout(new GridLayout(2, 2));
        JPasswordField passwordField = new JPasswordField();
        passwordField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent event) {
                System.out.println("key typed");
            }
            @Override
            public void keyReleased(KeyEvent event) {
                System.out.println("key released");
            }
            @Override
            public void keyPressed(KeyEvent event) {
                System.out.println("key pressed");
            }
        });
        frame.add(passwordField);
        frame.setSize(300, 100);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Output:

key pressed
key typed
key released
key pressed
key typed
key pressed
key typed
key released
key released
key pressed
key typed
key released
key pressed

Nguồn tham khảo

https://www.geeksforgeeks.org/java-swing-jpasswordfield/

http://www.java2s.com/Tutorials/Java/Swing_How_to/JPasswordField/Handle_key_event_on_JPasswordField.htm

 

Leave a Comment

Your email address will not be published. Required fields are marked *