我是一个初学者,我有一个 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
,它包装了 Product
的 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)));
}
});
表 API 可能是 Swing 库中第三个最复杂的 API(底层文本组件和 JTree
API 更复杂),但它远不是您会做的最常见的事情之一。如果您能够理解它,您会发现 API 的其余部分相对简单(包括掌握树 API ;))
关于Java Resultset 和 AbstractTableModel 更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31283884/