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 中的布尔复选框