首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable和AbstractTableModel更新JTable

JTable和AbstractTableModel更新JTable
EN

Stack Overflow用户
提问于 2015-07-08 05:05:03
回答 1查看 948关注 0票数 0

我是初学者,我有一个JTable,我想用一个结果集填充它,每当用户在TextField中输入一个搜索关键字,然后单击Search时,这个结果集就会发生变化。我搜索了一个星期,但我仍然不知道如何使用AbstratTableModel和我的结果集显示和刷新JTable后,每次点击搜索按钮。

以下是整个代码:

view.CatalogueSWING.java

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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

代码语言:javascript
复制
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,每次我在Search TextField中用关键字单击"Search“。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 05:20:35

首先看一下如何使用表,了解更多细节。

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

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

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

代码语言:javascript
复制
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.

代码语言:javascript
复制
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;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31283884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档