Java Resultset和AbstractTableModel更新JTable

时间:2015-07-08 05:05:03

标签: java swing jtable resultset abstracttablemodel

我是初学者,我有JTable,我想填充一个Resultset,每当用户在TextField中输入Search关键字时,都应该更改,然后单击Search按钮。我现在搜索了一个星期,我仍然不知道如何在每次搜索按钮点击后使用带有我的Resultset的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");
            }
        });  
 }

以下是商务舱:

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,我搜索了很多,我仍然不知道如何使用它与我的Resultset一起使用它来每次点击&#时都会更新JTable 34;搜索按钮&#34;在搜索TextField中使用一些关键字。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

TableModel提供了JTable所需的多种方法,可以决定如何最好地展示您的数据。

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

因此,拥有这些基本信息,我们可以生成一个简单的TableModel,其中包含List Product个,例如......

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

}

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

要使用它,您只需使用ProductTableModel方法的结果创建一个新的SearchByKeyWord,并将其应用于您现有的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;)