Java JTable没有显示MySQL的所有行

时间:2013-02-26 13:46:23

标签: java swing jdbc jtable defaulttablemodel

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

3 个答案:

答案 0 :(得分: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,为您完成所有工作。

答案 1 :(得分: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)Concurency in Swing存在潜在问题已经可见的GUI的所有更新必须在Event Dispatch Thread上完成

  • 包裹在invokeLater

  • Runnable#Thread调用JDBC(通过在每行中包裹invokeLater

  • SwingWorker

  • 调用

答案 2 :(得分:0)

您只为整个ResultSet创建一个TableModel。