Java 更新 JTable 的结果集和 AbstractTableModel

Java Resultset and AbstractTableModel to update JTable

我是初学者,我有一个 JTable,我想用结果集填充该结果集,每次用户在 TextField 中输入搜索关键字然后单击“搜索”按钮时,结果集都会更改。我现在搜索了一个星期,但我仍然不知道如何在每次单击搜索按钮后将 AbstratTableModel 与我的结果集一起使用以显示和刷新 JTable。

这是完整的代码:

view.CatalogueSWING.java

public class CatalogueSWING extends JFrame{


 JLabel jLabelMC = new JLabel("Key Word"); 
 JTextField jTextFieldMC = new JTextField(20); // The textfield that contains the search keyword
 JButton jButtonSearch = new JButton("Search");
 CatalogueBusiness ca; // the business class which contains the "SearchByKeyWord method"
 JTable table;
 JPanel pCenter;
 //---

 public CatalogueSWING() {
     ca = new CatalogueBusiness();

     JPanel pNorth = new JPanel();
     pNorth.setLayout(new FlowLayout());

     pNorth.add(jLabelMC);
     pNorth.add(jTextFieldMC);
     pNorth.add(jButtonSearch);

     pCenter = new JPanel();
     pCenter.setLayout(new BorderLayout());

     pCenter.add(table);

     this.setLayout(new BorderLayout());
     this.add(pCenter, BorderLayout.CENTER);
     this.setSize(900, 500);
     pCenter.add(new JScrollPane(table));
     this.add(pNorth, BorderLayout.NORTH);

     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setVisible(true);

     jButtonSearch.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                String kw = jTextFieldMC.getText();
                table = new JTable(ca.SearchByKeyWord(kw)); // SearchByKeyWord(String kw) is the method in my CatalogueBusiness class in another package.
                pCenter.add(table);

                System.out.println("You clicked the button");
            }
        });  
 }

这是正事 Class :

business.CatalogueBusiness.java :

@Override
    public List<Product> SearchByKeyWord(String kw) {
        List<Product> listProducts = new ArrayList<Product>();

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB_TPJDBC","root","password");

        PreparedStatement ps = conn.prepareStatement("select * from PRODUCTS where NAME_PROD like ?");
        ps.setString(1, "%"+kw+"%");
        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            Productp = new Produit();
            p.setIdProduct(rs.getInt("ID_PROD"));
            p.setNomProduct(rs.getString("NAME_PROD"));
            p.setPrice(rs.getDouble("PRICE"));
            p.setQuantite(rs.getInt("QUANTITY"));

            listProducts.add(p);    
        } 

        //ps.close();
        //conn.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return listProducts;
}

这是产品 Class :

business.Product.java :

import java.io.Serializable;

public class Product implements Serializable {

    private int idProduct;
    private String nomProduct;
    private double price;
    private int quantity;


    public Produit(String nomProduct, double price, int quantity) {
        super();
        this.nomProduct = nomProduct;
        this.price = price;
        this.quantity = quantity;
    }
    public Product() {
        super();
    }
    // getters & setter ...
    // ...

最后是 AbsractTableModel

business.ProductModel.java

public class ProduitModel extends AbstractTableModel{

    @Override
    public int getColumnCount() {
    //....
}
@Override
public int getRowCount() {
    //...
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    //...
}
@Override
public String getColumnName(int column) {
//...
}

我停在这里,我不知道如何在我的案例中使用 AbstractTableModel,我搜索了很多但我仍然不知道如何将它与我的结果集一起使用以在每次单击 "Search Button" 在搜索文本字段中使用一些关键字。

提前致谢。

首先查看 How to use tables 了解更多详情。

TableModel 提供了 JTable 所需的多种方法来决定如何最好地显示数据。

  • getRowCount,告诉 table 它必须显示多少行
  • getColumnCount,告诉 table 它必须显示多少列
  • getColumnName,告诉 table 特定列的名称,这由 table header
  • 显示
  • getColumnClass,由 table 用来决定在没有为列 [=49] 提供自定义渲染器的情况下应该使用哪个单元格 renderer/editor =]
  • getValueAt、returns 给定单元格的值 (row/column)
  • setValueAt,请求模型更新给定单元格的值
  • isCellEditable,确定给定的单元格是否可以编辑

因此,有了这些基本信息,我们可以生成一个简单的 TableModel,它包含 ListProduct,例如...

public static class ProductTableModel extends AbstractTableModel {

    protected static final String[] COLUMN_NAMES = {"id", "Name", "Price", "Quantity"};
    protected static final Class[] COLUMN_TYPES = {Integer.class, String.class, Double.class, Integer.class};
    private List<Product> products;

    public ProductTableModel(List<Product> products) {
        this.products = new ArrayList<>(products);
    }

    @Override
    public int getRowCount() {
        return products.size();
    }

    @Override
    public int getColumnCount() {
        return COLUMN_NAMES.length;
    }

    @Override
    public String getColumnName(int column) {
        return COLUMN_NAMES[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return COLUMN_TYPES[columnIndex];
    }

    protected Product getProductForRow(int row) {
        return products.get(row);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Product product = getProductForRow(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = product.getIdProduct();
                break;
            case 1:
                value = product.getNomProduct();
                break;
            case 2:
                value = product.getPrice();
                break;
            case 3:
                value = product.getQuantity();
                break;
        }
        return value;
    }

}

现在,这是一个非常简单的例子,non-editable。

要使用它,您只需使用 SearchByKeyWord 方法的结果创建一个新的 ProductTableModel 并将其应用于您现有的 JTable...

jButtonSearch.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        String kw = jTextFieldMC.getText();
        table.setModel(new ProductTableModel(ca.SearchByKeyWord(kw)));
    }
});  

table API 可能是 Swing 库中第三复杂的 API (底层文本组件和 JTree API 更复杂),但它远远不是您将要做的最常见的事情之一。如果你能理解它,你会发现 API 的其余部分相对简单(包括掌握树 API ;))