Java JTable 未显示 MySQL 中的所有行

Posted

技术标签:

【中文标题】Java JTable 未显示 MySQL 中的所有行【英文标题】:Java JTable not showing all rows from MySQL 【发布时间】:2013-02-26 13:46:23 【问题描述】:

我有一个 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();
                
        

【问题讨论】:

【参考方案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,这一切都为您完成。

【讨论】:

@user210068 错字已修复。刷新屏幕【参考方案2】:

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) Concurency in Swing 存在潜在问题,对已经可见的 GUI 的所有更新都必须在 Event Dispatch Thread 上完成

通过包裹在invokeLater

Runnable#Thread 调用 JDBC(通过在 invokeLater 内包装每一行)

SwingWorker调用

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Java JTable 未显示 MySQL 中的所有行的主要内容,如果未能解决你的问题,请参考以下文章

在 JAVA swing 中将数据库记录显示到 JTable

Java Swing,尝试用图像图标复选框替换 JTable 中的布尔复选框

如何在 JTable 中显示 MySQL 中的数据

如何将 MySQL 表中的数据导入 Java JTable?

JAVA中的JTable如何在显示的时候默认选择到第一行

PreparedStatement 最大查询,参数未在 Java 中执行