Java Swing JTable

Danh sách bài viết về thành phần giao diện Java Swing :

rong bài viết này kynangcntt.info hướng dẫn các bạn sử dụng một cách cơ bản nhất điều khiển JTable.

Chúng ta sẽ xây dựng chương trình như hình sau:

 

để thực hiện các chức năng:

a. Thêm một sinh viên vào danh sách sinh viên và hiển thị danh sách sinh viên trong JTable.

b. Kích chuột vào một hàng trong danh sách sinh viên được hiển thị ở JTable sẽ hiển thị toàn bộ các thông tin của sinh viên ở hàng đó lên các JTextField cho phép người dùng hiệu chỉnh các thông tin, sau đó bấm nút Cập Nhật để lưu các thông tin đã chỉnh sửa.

c. Kích chuột vào một hàng trong danh sách sinh viên được hiển thị ở JTable sau đó kích nút Xóa để thực hiện việc xóa sinh viên ở hàng được chọn ra khỏi danh sách sinh viên.

d. Chức năng tìm kiếm các bạn tự code.

HƯỚNG DẪN

Tạo project mới, sau đó tạo mới một đối tượng JFrame bằng cách kích phải chuột vào <default package> và chọn New \ JFrame Form đặt tên là JTableDemo với package là khamphacntt.com.vn. Sau đó thực hiện tuần tự các bước sau:

1. Đầu tiên các bạn sử dụng các tính năng kéo thả trong quá trình thiết kế sử dụng Netbeans IDE để trình bày giao diện chương trình ứng dụng như hình trên bao gồm 3 điều khiển JTextField được đặt tên là txtMaSinhVien, txtTenSinhVien, txtSoDienThoaiSinhVien bằng cách kích chuột phải lên cac đối tượng này và chọn Change Variable Name, cửa sổ Rename sẽ hiển thị và các bạn nhập vào tên tương ứng của các điều khiển. Bấm phím F2 sau khi chọn các điều khiển để xóa phần Text mặc định của điều khiển.

2. Tiếp tục kéo các điều khiển JButton vào cửa sổ, sau khi kéo vào cửa sổ bấm phím F2 để thiết lập tiêu đề cho điều khiển button lần lượt là Thêm, Cập Nhật, Xóa, Tìm và đặt tên cho các điều khiển này lần lượt là btnThem, btnCapNhat, btnXoa, btnTimKiem.

3. Tiếp theo kéo điều khiển JTable vào cửa sổ và đặt tên là tblSinhViens, kích chuột phải vào điều khiển table này và chọn Table Contents, cửa sổ Customize xuất hiện, chọn tab Columns để thiết lập tiêu đề cho bảng và tab Rows để chỉ định số dòng cho bảng.

4. Tiếp đến kích chọn Source để chuyển qua phần code trong Netbeans và khai báo các biến toàn cục như sau:

1
2
3
4
public class JTableDemo extends javax.swing.JFrame {
    private DefaultTableModel dtmSinhVien;
    private ArrayList<SinhVien> sinhViens;
    private int selectedIndex = -1;

5. Trong hàm khởi tạo nhập vào myInit() ở dưới dòng lệnh initComponents(); được Netbeans phát sinh sẵn. Chương trình báo lỗi, di chuyển con trỏ đến vị trí báo lỗi, bấm Alt +Enter và chọn Create method “myInit()” in khamphacntt.com.vn.JTableDemo để tạo mới phương thức. Bấm tổ hợp phím Ctrl + B để nhảy đến vị trí định nghĩa cho phương thức vừa tạo myInit() và nhập vào nội dung như sau:

1
2
3
4
5
6
7
8
private void myInit() {
        sinhViens = new ArrayList<>();
        
        dtmSinhVien = (DefaultTableModel) tblSinhViens.getModel();
        tblSinhViens.setModel(dtmSinhVien);
        
        setLocationRelativeTo(null);
    }

6. Sau đó bấm vào Design để chuyển về chế độ thiết kế, kích đúp chuột vào nút Thêm, và nhập vào nội dung sau:

1
2
3
4
5
6
//Thêm đối tượng sinh viên vào danh sách arraylist
sinhViens.add(taoSinhVien());
//Nạp dữ liệu vào table model
loadDataIntoTableModel();
//Xóa trắng tất cả text field nhập liệu
setAllTextFields("", "", "");

7. Tiếp theo chúng ta tạo mới class SinhVien như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package khamphacntt.com.vn;
/**
 *
 * @author khamphacntt.com.vn
 */
public class SinhVien {
    private String maSV,tenSV,sdtSV;
    public SinhVien() {
    }
    public SinhVien(String maSV, String tenSV, String sdtSV) {
        this.maSV = maSV;
        this.tenSV = tenSV;
        this.sdtSV = sdtSV;
    }
    public String getMaSV() {
        return maSV;
    }
    public void setMaSV(String maSV) {
        this.maSV = maSV;
    }
    public String getTenSV() {
        return tenSV;
    }
    public void setTenSV(String tenSV) {
        this.tenSV = tenSV;
    }
    public String getSdtSV() {
        return sdtSV;
    }
    public void setSdtSV(String sdtSV) {
        this.sdtSV = sdtSV;
    }       
}

8. Tạo mới phương thức taoSinhVien() như sau:

1
2
3
4
5
6
7
private SinhVien taoSinhVien(){
        return new SinhVien(
                txtMaSinhVien.getText().trim(),
                txtTenSinhVien.getText().trim(),
                txtSoDienThoaiSinhVien.getText().trim()
        );
}

9. Tạo mới phương thức loadDataIntoTableMode()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void loadDataIntoTableModel(){
        //Xóa dữ liệu cũ trên table model
        clearOldDataInTableModel();
        
        int stt = 0;
        for (SinhVien sinhVien : sinhViens) {
            stt++;
            dtmSinhVien.addRow(new Object[]{
                Integer.toString(stt),
                sinhVien.getMaSV(),
                sinhVien.getTenSV(),
                sinhVien.getSdtSV()
            });
        }               
 }

10. Tạo mới phương thức clearOldDataInTableModel():

1
2
3
4
5
6
7
8
9
10
11
12
private void clearOldDataInTableModel(){
        //Xóa theo cách thứ nhât, hiệu suất làm việc thấp hơn
//        while (dtmSinhVien.getRowCount()>0) {
//            dtmSinhVien.removeRow(0);
//        }
        
        //Xóa theo cách 2, hiệu suất làm việc cao hơn
        int rowCount = dtmSinhVien.getRowCount();
        for(int i = rowCount;i>0;i--){
            dtmSinhVien.removeRow(i-1);
        }
    }

11. Tạo mới phương thức setAllTextFields()

1
2
3
4
5
6
7
8
private void setAllTextFields(String ma,String ten,String sdt){
        txtMaSinhVien.setText(ma);
        txtTenSinhVien.setText(ten);
        txtSoDienThoaiSinhVien.setText(sdt);
        
        //Thiết lập focus vào txtMaSinhVien (con trỏ vào trường này)
        txtMaSinhVien.requestFocus();
    }

12. Kích nút Design để chuyển về chế độ thiết kế, kích phải chuột trên điều khiển JTable, chọn Events \ Mouse \ mouseClicked để cài đặt trình xử lý sự kiện khi người dùng kích chuột vào điều khiển. Nhập đoạn code sau:

1
2
3
4
5
6
7
8
9
10
11
12
private void tblSinhViensMouseClicked(java.awt.event.MouseEvent evt) {                                         
    // TODO add your handling code here:
    selectedIndex = tblSinhViens.getSelectedRow();
    
    if (selectedIndex!=-1) {
        setAllTextFields(
            dtmSinhVien.getValueAt(selectedIndex, 1).toString(),
            dtmSinhVien.getValueAt(selectedIndex, 2).toString(),
            dtmSinhVien.getValueAt(selectedIndex, 3).toString()
        );
    }
}

13. Bấm nút Design để chuyển qua chế độ thiết kế, kích đúp chuột vào nút Cập Nhật và nhập vào đoạn code sau:

1
2
3
4
5
6
7
8
9
10
11
12
private void btnCapNhatActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // TODO add your handling code here:
    if (selectedIndex!=-1) {
        SinhVien sv = sinhViens.get(selectedIndex);
        sv.setMaSV(txtMaSinhVien.getText().trim());
        sv.setTenSV(txtTenSinhVien.getText().trim());
        sv.setSdtSV(txtSoDienThoaiSinhVien.getText().trim());
        
        selectedIndex = -1;
        loadDataIntoTableModel();
    }
}

14. Tương tự, kích đúp vào nút Xóa và nhập vào đoạn code sau:

1
2
3
4
5
6
7
8
9
10
11
privatevoidbtnXoaActionPerformed(java.awt.event.ActionEvent evt) {                                      
    // TODO add your handling code here:
    selectedIndex = tblSinhViens.getSelectedRow();
    if(selectedIndex!=-1) {
        sinhViens.remove(selectedIndex);
        setAllTextFields("", "", "");
        selectedIndex = -1;
        loadDataIntoTableModel();
    }
    
}

Bài tiếp theo : Tổng kết OOP-SWING