【问题标题】:Java Resultset and AbstractTableModel to update JTableJava 结果集和 AbstractTableModel 更新 JTable
【发布时间】:2015-07-08 05:05:03
【问题描述】:

我是一个初学者,我有一个 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");
            }
        });  
 }

这是商务舱:

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在搜索文本字段中添加一些关键字。

提前谢谢你。

【问题讨论】:

    标签: java swing jtable resultset abstracttablemodel


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 非常感谢,它正在工作,现在我明白了,非常感谢你的帮助,你救了我!
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多