0

我有一个 JTable 的问题,即当从 MySQL 表返回超过 1 行时,JTable 只显示 1 条记录 - (最后一条),但是当我尝试简单时System.out.print,它会显示所有记录。这是我的代码:

 System.out.println("MySQL Connect Example.");
    Connection conn = null;
    String url = "jdbc:mysql://xxx.xx.xxx.xx:3306/";
    String dbName = "smartcart";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "xxx"; 
    String password = "xxx";
    Statement stmt = null;
    ResultSet rs = null;
        cartID=jTextField1.getText().trim();
        if(cartID.matches("(\\w*)") && !cartID.isEmpty())
        {
           jLabel2.setText("Searching.....");
               try {
                        Class.forName(driver).newInstance();
      conn = DriverManager.getConnection(url+dbName,userName,password);
      System.out.println("Connected to the database");
      stmt = conn.createStatement();
                       String query = "SELECT * FROM user_stock WHERE cartID="+cartID;
                       rs = stmt.executeQuery(query);
                       jInternalFrame1.setVisible(true);
                        while (rs.next()) {
                              jTable1.setModel(new javax.swing.table.DefaultTableModel(
                               new Object [][] {
                                  {rs.getString("id"), rs.getString("product_name"), rs.getString("product_code"), rs.getString("product_quantity"), rs.getString("product_price"), "0"}
                               },
                                new String [] {
                                  "Product No.", "Product Name", "Product Code", "Product Quantity", "Product Price", "Discount"
                                   }
                                ));
                        }
      conn.close();
      System.out.println("Disconnected from database");

                        }
               catch (Exception e) {
                  e.printStackTrace();
                }
        }
4

3 回答 3

1

您正在为每个返回的行重新创建一个新的 TableModel,而不是为所有行重新创建一个模型:

String query = "SELECT * FROM user_stock WHERE cartID="+cartID;
rs = stmt.executeQuery(query);
jInternalFrame1.setVisible(true);
javax.swing.table.DefaultTableModel model = new javax.swing.table.DefaultTableModel();
model.setColumnIdentifiers(new String [] {
                              "Product No.", "Product Name", "Product Code", "Product Quantity", "Product Price", "Discount" });
 jTable1.setModel(model);
 while (rs.next()) {
     model.addRow(new Object [] {
               rs.getString("id"), rs.getString("product_name"), rs.getString("product_code"), rs.getString("product_quantity"), rs.getString("product_price"), "0"});       
 }

警告:我没有测试也没有执行上面的代码,但修复错别字或缺少括号应该不难。

现在,您还可以简化您的生活并直接重复使用ResulSetTableModel,这一切都为您完成。

于 2013-02-26T14:16:24.840 回答
1

1)XxxTableModel在无限循环中重新创建,每个循环都有一个新模型

2)不要创建一个新的XxxTableModel,也不要在try - catch - finally块内

jTable1.setModel(new javax.swing.table.DefaultTableModel(

3) 不包括在内

new Object [][] {
{
rs.getString("id"), rs.getString("product_name"), rs.getString("product_code"),
   rs.getString("product_quantity"), rs.getString("product_price"), "0"}
}, 
new String [] {"Product No.", "Product Name", "Product Code", "Product Quantity",
  "Product Price", "Discount" }
));

4) 重用XxxTableModel

5) 然后在 JDBC 中添加一个新行到XxxTableModel已经初始化为局部变量的行

6) Swing 中的 Concurency存在潜在问题,所有对已经可见的 GUI 的更新都必须在Event Dispatch Thread

  • 通过包裹在里面invokeLater

  • 从调用 JDBC (通过为每一行Runnable#Thread包装内部)invokeLater

  • 从调用SwingWorker

于 2013-02-26T14:17:32.627 回答
0

您必须为整个 ResultSet 创建一个 TableModel。

于 2013-02-26T13:50:15.970 回答