Java Resultset 和 AbstractTableModel 更新 JTable

标签 java swing jtable resultset abstracttablemodel

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

这是完整的代码:

查看.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");
            }
        });  
 }

这是商务舱:

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;
}

这是产品类别:

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,我搜索了很多,但我仍然不知道如何将它与我的结果集一起使用,以便每次单击“搜索按钮”时不断更新 JTable在搜索文本字段中使用一些关键字。

提前谢谢您。

最佳答案

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

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

  • getRowCount,告诉表格必须显示多少行
  • getColumnCount,告诉表格必须显示多少列
  • getColumnName,告诉表格特定列的名称,这由表格标题显示
  • getColumnClass,由表用来决定在未为列提供自定义渲染器的情况下应使用哪个单元格渲染器/编辑器
  • getValueAt,返回给定单元格(行/列)的值
  • setValueAt,请求模型更新给定单元格的值
  • isCellEditable,确定给定单元格是否可以编辑

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

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;
    }

}

现在,这是一个非常简单、不可编辑的示例。

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

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

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

关于Java Resultset 和 AbstractTableModel 更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31283884/

相关文章:

java - 如何使用方法调用在另一个面板中显示特定面板?

java - java应用程序中的进度条和线程错误

java - 使用 setCellEditor 方法设置时 JTable 单元格编辑器不起作用

java - 为什么在向 DefaultTableModel 添加新行时 JTable 不更新其 View ?

java - 当光标位于 JDialog 之外时更改光标

Java - 单击按钮时将数组列表中的项目添加到 JTable

java - TransformerFactory 上有多个 URIResolver?

Java缓冲区策略: compiler doesn't like it

java - 如何创建 XML 解析的泛型?

java - 常数时间等于