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

すべての行に対して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すべてのループの新しいモデルであるエンドレスループで再作成されます

XxxTableModel2)新しいブロックや内部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

XxxTableModel5)次に、ローカル変数としてすでに初期化されている行にJDBC内の新しい行を追加します

6) Swingの同時実行性に潜在的な問題があります。すでに表示されているGUIへのすべての更新は次の手順で実行する必要があります。Event Dispatch Thread

  • 中に包むことによってinvokeLater

  • からJDBCを呼び出します(各行をRunnable#Thread内側にラップすることにより)invokeLater

  • から呼び出すSwingWorker

于 2013-02-26T14:17:32.627 に答える
0

ResultSet 全体に対して TableModel を 1 つだけ作成する必要があります。

于 2013-02-26T13:50:15.970 に答える