[JavaSwing] JTextField

Nội dung
Tạo JTextField đơn giản
Lấy, đặt dữ liệu từ JTextField
Căn lề và bắt sự kiện cho JTextField
Một số phương thức khác

JTextField là một đối tượng cho phép người dùng nhập một dòng văn bản. Thường dùng để nhập dữ liệu với các thông tin ngắn.
JTextField
Trong hình minh họa trên chúng ta có 4 JTextField với cho phép người dùng nhập 4 thông tin tương ứng với 4 JLabel ở bên trái.

Ví dụ 1: Tạo JTextField đơn giản

package nguyenvanquan7826.JTextField;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MyJTextField extends JFrame {
	public MyJTextField() {
		// create JFrame
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new GridLayout(2, 1, 5, 5));

		// create and add JTextField
		JTextField tf = new JTextField(20);
		add(tf);

		// add a JButton
		add(new JButton("Ok"));

		// Display JFrame
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	public static void main(String[] args) {
		new MyJTextField();
	}
}

create JtextField
Các hàm khởi tạo JTextField
– JTextField(): Tạo mới 1 JTextField
JTextField(Document doc, String text, int columns): Tạo 1 JTextField sử dụng mô hình lưu trữ văn bản với đoạn text và số cột (coloumns)
JTextField(int columns): Tạo JTextField trống với độ rộng là columns
JTextField(String text): Tạo JTextField với text cho trước
JTextField(String text, int columns): Tạo JTextField với text và độ rộng cho trước.

Ví dụ 2: Lấy, đặt và xử lý dữ liệu từ JTextField

Trong ví dụ này chúng ta sẽ làm 1 demo nhỏ giống như hình ảnh mở đầu của bài, có thêm 1 JButton để nhập lại dữ liệu – Một demo tính tiễn lãi (Không thông báo nếu dữ liệu sai nhưng sẽ tự nhảy đến JTextField nếu nó không có dữ liệu).

package nguyenvanquan7826.JTextField;

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.JTextField;

public class TienLai extends JFrame implements ActionListener {
	private JTextField tfTienGui, tfLaiXuat, tfThang, tfTienLai;

	public TienLai() {
		// ------------ create JFrame ------------ //
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new GridLayout(5, 2, 5, 5));

		// ------------ add content ------------ //

		int size = 15;
		add(new JLabel("Tiền gửi"));
		tfTienGui = new JTextField(size);
		add(tfTienGui);

		add(new JLabel("Lãi xuất / Tháng"));
		tfLaiXuat = new JTextField(size);
		add(tfLaiXuat);

		add(new JLabel("Tháng"));
		tfThang = new JTextField(size);
		add(tfThang);

		add(new JLabel("Tiền lãi"));
		tfTienLai = new JTextField(size);
		tfTienLai.setEditable(false);// khong cho phep nhap du lieu
		add(tfTienLai);

		add(createJButton("Tính"));
		add(createJButton("Nhập lại"));

		// ------------ display ------------
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	private JButton createJButton(String buttonName) {
		JButton btn = new JButton(buttonName);
		btn.addActionListener(this);
		return btn;
	}

	public static void main(String[] args) {
		new TienLai();
	}

	private void process() {
		// check data
		String text = tfTienGui.getText();
		double tienGui = 0, tienLai = 0, thang = 0, laiXuat = 0;

		// tien gui
		if (text.equals("")) {
			tfTienGui.requestFocus(); // nhay den de nhap tien gui
		} else {
			tienGui = Double.parseDouble(text);

			// lai xuat
			text = tfLaiXuat.getText();
			if (text.equals("")) {
				tfLaiXuat.requestFocus(); // nhay den de nhap lai xuat
			} else {
				laiXuat = Double.parseDouble(text);

				// thang
				text = tfThang.getText();
				if (text.equals("")) {
					tfThang.requestFocus(); // nhay den de nhap thang
				} else {
					thang = Integer.parseInt(tfThang.getText());
				}
			}
		}

		// process data
		double lai = tienGui * laiXuat * thang;
		tfTienLai.setText(String.valueOf(lai)); // hien thi ket qua
	}

	private void clear() {
		tfTienGui.setText("");
		tfTienGui.requestFocus(); // nhay ve de nha tien gui
		tfLaiXuat.setText("");
		tfThang.setText("");
		tfTienLai.setText("");
	}

	// methods of ActionListener
	@Override
	public void actionPerformed(ActionEvent evt) {
		String command = evt.getActionCommand();
		if (command == "Tính") {
			process();
		}
		if (command == "Nhập lại") {
			clear();
		}
	}
}

get data of JTextField
Những điều đáng chú ý
Muốn lấy dữ liệu (mà ở đây thực chất là một chuỗi) từ JTextField ta dùng phương thức getText().
Muốn đặt dữ liệu cho JtextField ta dùng phương thức setText(String text).
Phương thức requestFocus() giúp con trỏ nhảy (tập trung) đến JTextField đó.
Phương thức setEditable(boolean edit) để đặt có được nhập dữ liệu cho JTextField hay không.

Ví dụ 3: Căn lề và tạo sự kiện cho JTextField

Trong ví dụ này chúng ta sẽ tạo 1 JTextFiel mà khi nhập vào thì text của chúng ta được căn lề phải (mặc định là lề trái), khi ấn phím enter thì sẽ hiển thị dữ liệu vừa nhập lên 1 JLabel.

package nguyenvanquan7826.JTextField;

import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class AlignAndAction extends JFrame implements KeyListener {

	private JTextField tf;
	private JLabel lb;

	public AlignAndAction() {
		createJFrame();
		addContent();
		displayJFrame();
	}

	// create JFrame
	private void createJFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new GridLayout(2, 1, 5, 5));
	}

	// display JFrame
	private void displayJFrame() {
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	private void addContent() {
		tf = new JTextField(20);
		tf.setHorizontalAlignment(JTextField.RIGHT);// can trai
		tf.addKeyListener(this);
		add(tf);

		lb = new JLabel("Not data");
		add(lb);
	}

	private void updateData() {
		lb.setText(tf.getText());
	}

	public static void main(String[] args) {
		new AlignAndAction();
	}

	@Override
	public void keyPressed(KeyEvent e) {// nhan vao phim
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			updateData();
		}
	}

	@Override
	public void keyReleased(KeyEvent e) { // nha phim ra
	}

	@Override
	public void keyTyped(KeyEvent e) { // nhap 1 phim
	}
}

bắt sự kiện của JTextField
Cũng giống như JButton, JTextField cũng bắt được sự kiện của chuột và thậm chí là cả của các phím trên bàn phím nữa. Để bắt sự kiện của các phím ta sử dụng phương thức addKeyListener() và làm tương tự như các cách bắt sự kiện của JButton nhưng với KeyListener chứ không phải với ActionListener.
Sử dụng phương thức setHorizontalAlignment để căn lề cho JTextField.

Một số phương thức khác

getSelectedText(): lấy đoạn text được chọn trong JTextField
setSelectionStart(int selectionStart) và setSelectionEnd(int selectionEnd) đặt vị trí bắt đầu và kết thúc để chọn text. Nếu không có phương thức setSelectionStart thì text sẽ được chọn từ vị trí hiện thời của con trỏ (nhỏ hơn selectionEnd) đến selectionEnd. Nếu không có phương thức setSelectionEnd thì text sẽ được chọn từ vị trí selectionStart đến vị trí hiện thời của con trỏ (lớn hơn selectionStart).
getCaretPosition() và setCaretPosition(position) lấy và đặt vị trí hiện thời của con trỏ.

Tham khảo thêm: class JTextField, Use JTextField