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