Java: Cách sử dụng Text Field (JTextField)

Text field là một điều khiển văn bản cơ bản cho phép người dùng có thể điền một lượng văn bản nhỏ như họ tên, email, điện thoại. Khi người dùng điền xong dữ liệu và nhấn Enter chẳng hạn thì text field sẽ kích hoạt một action event. Nếu bạn cần điền dữ liệu nhiều hơn và hiển thị trên nhiều dòng thì ta dùng text area.

Swing cung cấp một số lớp cho phép ta tương tác với các loại text field khác nhau như sau:

Ví dụ sau đây hiển thị text field và text area cơ bản. Text field cho phép người dùng nhập văn bản, còn text area thì không. Khi người dùng nhấn nút Enter trong text field thì chương trình sẽ copy nội dung của nó vào text area, sau đó sẽ thiết lập hiệu ứng bôi đen cho tất cả văn bản trong text field.

A snapshot of TextDemo

Toàn bộ đoạn mã của chương trình thể hiện hình ảnh ở trên được thể hiện trong ví dụ TextDemo. Câu lệnh sau đây sẽ tạo và thiết lập cho text field:

textField = new JTextField(20);

Đối số kiểu nguyên được truyền tới hàm tạo JTextField20 là số cột của text field.

Lưu ý: Ta nên chỉ định số cột cho text

 field, nếu không kích thước của text field sẽ thay đổi mỗi khi văn bản điền vào nó thay đổi.

Câu lệnh dưới đây dùng để đăng ký đối tượng TextDemo như là một action listener cho text field.

textField.addActionListener(this);

Phương thức actionPerformed sẽ xử lý action event từ text field:

private final static String newline = “\n”;

public void actionPerformed(ActionEvent evt) {
    String text = textField.getText();
    textArea.append(text + newline);
    textField.selectAll();
}

Cần lưu ý khi sử dụng phương thức getText của TextField để truy xuất văn bản của text field. Văn bản được trả về bởi phương thức này sẽ không bao gồm ký tự newline ứng với phím Enter là phím kích hoạt action event.

Vì lớp JTextField thừa kế từ lớp JTextComponent nên các text field rất uyển chuyển và có thể được tùy chỉnh một cách thoải mái. Ví dụ, ta có thể thêm một document listener hoặc một document filter để đưa ra thông báo khi text thay đổi, và trong trường hợp filter thì ta có thể thay đổi text field một cách phù hợp.

Ví dụ TextFieldDemo

Ví dụ TextFieldDemo bao gồm một text field và một text area. Khi bạn soạn các ký tự vào text field thì chương trình sẽ tìm những ký tự đó trong text area. Nếu chúng được tìm thấy thì chúng sẽ được tô xám. Nếu chương trình không tìm thấy thì nền của text field sẽ chuyển thành màu pink. Thanh trạng thái bên dưới text area sẽ hiển thị thông báo việc tìm thấy văn bản hay không. Phím Escape (Esc) được dùng để tiến hành lần tìm kiếm mới hoặc kết thúc lần tìm kiếm hiện thời. Hình dưới đây thể hiện cho ví dụ TextFieldDemo.

A snapshot of TextFieldDemo

Để tô xám cho văn bản được tìm thấy thì ví dụ này sử dụng một highlighter và một painter. Đoạn mã dưới đây tạo và thiết lập highlighter và painter cho text area.

final Highlighter hilit;
final Highlighter.HighlightPainter painter;

hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
textArea.setHighlighter(hilit);

Câu lệnh sau sẽ thêm document listener vào document của text field.

entry.getDocument().addDocumentListener(this);

Các phương thức insertUpdate và removeUpdate của document listener sẽ gọi phương thức search nhằm mục đích tìm kiếm trong text area đồng thời tiến hành xử lý việc tô xám. Đoạn mã sau đây dùng để tô xám phần văn bản được tìm thấy, thiết lập và đặt dấu nháy vào phía cuối của phần văn bản được tìm thấy, thiết lập nền mặc định cho text field, và hiển thị một thông điệp trong thanh trạng thái. 

hilit.addHighlight(index, end, painter);
textArea.setCaretPosition(end);
entry.setBackground(entryBg);
message(“‘” + s + “‘ found. Press ESC to end search”);

Thanh trạng thái là một đối tượng JLabel. Đoạn mã sau thể hiện cách phương thức message được thực thi.

private JLabel status;

void message(String msg) {
    status.setText(msg);
}

Nếu không có sự tương thích nào trong text area thì đoạn mã sau sẽ thay đổi màu nền của text field thành màu pink và hiển thị một thông báo phù hợp.

entry.setBackground(ERROR_COLOR);
message(“‘” + s + “‘ not found. Press ESC to start a new search”);

Lớp CancelAction dùng để phản ứng với phím Escape như sau:

   class CancelAction extends AbstractAction {
       public void actionPerformed(ActionEvent ev) {
               hilit.removeAllHighlights();
               entry.setText(“”);
               entry.setBackground(entryBg);
           }
   }

API Text Field

Thiết lập hoặc lấy nội dung của text field

Phương thức/Hàm tạo

Mục đích

JTextField()
JTextField(String)
JTextField(String, int)
JTextField(int)

Tạo một text field. Đối số int sẽ chỉ định độ rộng theo dạng số cột. Đối số String chứa văn bản khởi tạo của trường.

void setText(String)
String getText()
(được định nghĩa trong JTextComponent)

Thiết lập hoặc lấy văn bản được hiển thị bởi text field.

 

Tinh chỉnh sự xuất hiện của text field

Phương thức

Mục đích

void setEditable(boolean)
boolean isEditable()
(được định nghĩa trong JTextComponent)

Thiết lập hoặc chỉ ra việc người dùng có thể chỉnh sửa văn bản trong text field.

void setColumns(int);
int getColumns()

Thiết lập hoặc lấy số cột của text field.

void setHorizontalAlignment(int);
int getHorizontalAlignment()

Thiết lập hoặc lấy văn bản được canh ngang. Ta có thể sử dụng đối số là JTextField.LEADINGJTextField.CENTER, và JTextField.TRAILING

 

Thực thi các chức năng của text field

Method

Purpose

void addActionListener(ActionListener)
void removeActionListener(ActionListener)Thêm hoặc xóa action listener.void selectAll()
(định nghĩa trong JTextComponent)Lấy tất cả các ký tự trong text field.

Ví dụ có sử dụng Text Field