[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.
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(); } }
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(); } } }
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 } }
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
cho em hỏi đoạn ("Ok") nghĩa là sao ạ ? em thấy nó hơi lạ.
Tại sao cần JFrame.EXIT_ON_CLOSE ạ khi em bỏ JFrame. đi mọi thứ chạy vẫn ổn ?
Bỏ đi được vì đang code trong class của JFrame, nếu code ở class khác thì bắt buộc phải có JFrame mới gọi được.
add(new JButton(“Ok”));
Thêm nút button OK
trong jdk 11 tại sao e dùng phương thức setActionCommand lại k được ạ
Nó báo lỗi như thế nào bạn?