Defaulttablemodel là gì

Ðề: Vấn đề cần hỏi về JTable (Gấp): DefaultTableModel, AbsTractModel , Renderer và Editor

Bạn này hổng nhiều chỗ trong quá trình học cho nên cảm giác của bạn bị choáng ngợp trước JTable , tớ nghĩ là JTree , JTextPane thì bạn cũng chưa hiểu rõ đâu , đúng k ?

Trong ngày đầu tiên đến với Swing của java kì 2 thì aptech đã nói với bạn là các component trong Swing đều có 3 thứ , đó là mô hình MVC , model view và controller

Tại sao lại có model , model là dữ liệu , dữ liệu của 1 component tức là model của comp đó

TableModel tức là dữ liệu của table , do đó có TableModel

TableModel là 1 interface , có 2 lớp cài đặt interface này là DefaultTableModel và AbstractTableModel
Thiết nghĩ 2 từ default và abstract bạn cũng đã hiểu rồi , để dùng nhanh table thì bạn nên dùng default , còn để có 1 table phức tạp thì bạn nên dùng abstract , vì đây là 1 lớp abstract . Và 1 lớp abstract là gì và thể hiện tính chất gì trong java thì bạn cũng đã biết đúng k

Còn renderer thì có nghĩa là sự biểu diễn dữ liệu của model , tức là view trong MVC
Editor là controller của table trong MVC .

Tóm lại , bạn nên xem lại MVC một cách sâu rộng nhất .
Vd như 1 cell trong 1 table là 1 JComboBox chẳng hạn

Cái khó trong AbstractTableModel là lớp TableColumn , bạn xem lớp này nhé !

Mình nói sơ qua để bạn tự suy nghĩ trước khi hiểu 1 component , hãy nhìn nó như 1 đối tượng và hiểu kĩ các concept của java nhé , vì nếu bậc thang đầu tiên bạn chưa thấm nhuần , chưa thể bước qua được thì sao có thể bước đến bước thứ 10 , 20 và ...

Chúc bạn học tốt ^^
Thân!

Home

Java

Hướng dẫn sử dụng JTable trong Java Swing

December 3, 2020

JTable là một trong những thành phần quan trọng của Java Swing package được sử dụng để hiển thị và chỉnh sửa dữ liệu theo dạng Table (Dữ liệu được trình bày theo dạng hàng và cột). Nó tương tự như một bảng tính trong excel file.

Khởi tạo JTable

JTable cung cấp một số constructor cho phép khởi tạo một JTable instance như sau:

  • JTable() – Khởi tạo một JTable rỗng.
  • JTable(int rows, int cols) – Khởi tạo một JTable với số dòng và cột được chỉ định.
  • JTable(Object[][] data, Object []Column) – Khởi tạo một Jtable với các tên cột được chỉ định trong Object[] Column và dữ liệu trong Object[][] data.

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

  • addColumn(TableColumn column) – Thêm một cột vào cuối bảng.
  • editCellAt(int row, int col) – Chỉnh sửa ô giao nhau của cột số col và hàng số row, nếu các chỉ số đã cho hợp lệ và ô tương ứng có thể chỉnh sửa được.
  • setValueAt(Object value, int row, int col) – Cập nhật giá trị tạo ô có số cột là col và hàng row thành giá trị value mới. 
  • clearSelection() – Bỏ chọn tất cả các cột và hàng trước đó đã được chọn.

Ví dụ tạo một bảng gồm 3 cột Name, Roll Number và Department. Lưu ý trong đây mình có sử dụng JScrollPane để cho phép JTable có thể cuộn trong trường hợp nó chứa nhiều dữ liệu.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class JTableExample {


    public static void main(String[] args) {

        JFrame jFrame = new JFrame();

        // Frame Title
        jFrame.setTitle("JTable Example");

        // Data to be displayed in the JTable
        String[][] data = {
                { "Kundan Kumar Jha", "4031", "CSE" },
                { "Anand Jha", "6014", "IT" }
        };

        // Column Names
        String[] columnNames = { "Name", "Roll Number", "Department" };

        // Initializing the JTable
        JTable jTable = new JTable(data, columnNames);
        jTable.setBounds(30, 40, 200, 300);

        // adding it to JScrollPane
        JScrollPane sp = new JScrollPane(jTable);
        jFrame.add(sp);
        // Frame Size
        jFrame.setSize(500, 200);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }
}

Output

Defaulttablemodel là gì

Sắp xếp trong JTable

Chắc hẵn dữ liệu dạng bảng như JTable nhu cầu sắp xếp dữ liệu là vô cùng cần thiết rồi phải không nào. Việc này chúng ta có thể làm khá đơn giản với setAutoCreateRowSorter() method được cung cấp sẵn trong JTable.

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

class JTableSorterTest {

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setTitle("JTableHeaderHide Test");
        String[] columnNames = {"Name", "Age", "City"};
        Object[][] data = {{"Raja", "35", "Hyderabad"}, {"Adithya", "25", "Chennai"},
                {"Vineet", "23", "Mumbai"},
                {"Archana", "32", "Pune"},
                {"Krishna", "30", "Kolkata"}};
        JTable table = new JTable(data, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);

        // Cho phep table sap xep
        table.setAutoCreateRowSorter(true);

        jFrame.add(scrollPane, BorderLayout.CENTER);
        jFrame.setSize(375, 250);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }
}

Output

Defaulttablemodel là gì

Filter trong JTable

Chúng ta có thể lọc một bảng bằng phương thức setRowFilter () của lớp TableRowSorter.

import java.awt.*;
import java.awt.event.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.table.*;

class FilterTableTest {


    public static void main(String args[]) {
        JTable table;
        TableModel model;
        JFrame jFrame = new JFrame();
        jFrame.setTitle("FilterTable Test");
        Object rows[][] = {{"Adithya", "Content Developer", 25000},
                {"Jai", "SME", 30000},
                {"Chaitanya", "Java Engineer", 45000},
                {"Ramesh", "Scala Developer", 40000},
                {"Ravi", "SAP  Consultant", 70000}};
        Object columns[] = {"Name", "Designation", "Salary"};
        model = new DefaultTableModel(rows, columns) {
            public Class getColumnClass(int column) {
                Class returnValue;
                if ((column >= 0) && (column < getColumnCount())) {
                    returnValue = getValueAt(0, column).getClass();
                } else {
                    returnValue = Object.class;
                }
                return returnValue;
            }
        };
        table = new JTable(model);
        final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        table.setRowSorter(sorter);
        jFrame.add(new JScrollPane(table), BorderLayout.CENTER);
        JPanel panel = new JPanel(new BorderLayout());
        JLabel label = new JLabel("Filter");
        panel.add(label, BorderLayout.WEST);
        final JTextField filterText = new JTextField("");
        panel.add(filterText, BorderLayout.CENTER);
        jFrame.add(panel, BorderLayout.NORTH);
        JButton button = new JButton("Filter");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String text = filterText.getText();
                if (text.length() == 0) {
                    sorter.setRowFilter(null);
                } else {
                    try {
                        sorter.setRowFilter(RowFilter.regexFilter(text));
                    } catch (PatternSyntaxException pse) {
                        System.out.println("Bad regex pattern");
                    }
                }
            }
        });
        jFrame.add(button, BorderLayout.SOUTH);
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }
}

Output

Defaulttablemodel là gì

Nguồn tham khảo

https://www.tutorialspoint.com/how-can-we-sort-a-jtable-on-a-particular-column-in-java

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

https://www.tutorialspoint.com/how-can-we-filter-a-jtable-in-java