Java实现点击Next按钮遍历ResultSet并逐行显示记录至TextField
嗨,我来帮你搞定这个库存系统的遍历问题!你猜的没错,核心问题就是没有把查询结果缓存起来,而是每次点击按钮都直接遍历到ResultSet的最后一行,所以才只会显示最后一条记录。下面给你一套完整的解决思路和代码示例:
解决步骤&代码实现
1. 先把ResultSet数据缓存到内存集合里
ResultSet是一次性的游标式对象,而且数据库连接关闭后就失效了,所以我们需要先把所有查询结果取出来,存到内存里的集合中。推荐用自定义实体类来封装每条库存记录,这样代码更清晰:
// 自定义库存实体类,对应你的数据库表字段 class Stock { private String stockId; private String productName; private int stockQuantity; // 其他字段根据你的表结构添加 // 构造方法 public Stock(String stockId, String productName, int stockQuantity) { this.stockId = stockId; this.productName = productName; this.stockQuantity = stockQuantity; } // Getter方法,用于取出字段值 public String getStockId() { return stockId; } public String getProductName() { return productName; } public int getStockQuantity() { return stockQuantity; } }
然后写一个加载数据的方法,把ResultSet转成List集合:
// 从数据库加载库存数据的方法 private List<Stock> loadStockData() { List<Stock> stockList = new ArrayList<>(); String querySql = "SELECT stock_id, product_name, stock_quantity FROM inventory"; // 替换成你的SQL // 使用try-with-resources自动关闭资源 try (Connection conn = DriverManager.getConnection("你的数据库URL", "用户名", "密码"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(querySql)) { // 遍历ResultSet,把每行转成Stock对象存入集合 while (rs.next()) { String id = rs.getString("stock_id"); String name = rs.getString("product_name"); int quantity = rs.getInt("stock_quantity"); stockList.add(new Stock(id, name, quantity)); } } catch (SQLException e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "加载库存数据失败:" + e.getMessage()); } return stockList; }
2. 维护遍历的状态变量
在你的窗口类中声明两个类级别的变量,用来保存缓存的数据和当前遍历的位置:
private List<Stock> stockDataList; // 缓存所有库存记录 private int currentIndex = -1; // 当前显示的记录索引,初始-1表示未开始遍历 // 假设你的TextField是这些(根据你的实际组件调整) private JTextField idTextField; private JTextField nameTextField; private JTextField quantityTextField;
3. 改造Next按钮的ActionListener逻辑
现在点击Next按钮时,只需要根据当前索引取出对应记录显示,而不是重新遍历整个ResultSet:
nextButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 先判断是否已经加载了数据 if (stockDataList == null || stockDataList.isEmpty()) { JOptionPane.showMessageDialog(null, "请先执行库存查询!"); return; } // 索引递增,判断是否超出范围 currentIndex++; if (currentIndex >= stockDataList.size()) { JOptionPane.showMessageDialog(null, "已经是最后一条记录啦!"); currentIndex = stockDataList.size() - 1; // 停在最后一行,或者重置为-1从头开始 return; } // 取出当前记录并显示到TextField Stock currentStock = stockDataList.get(currentIndex); idTextField.setText(currentStock.getStockId()); nameTextField.setText(currentStock.getProductName()); quantityTextField.setText(String.valueOf(currentStock.getStockQuantity())); } });
4. 改造查询按钮(submit)的逻辑
在查询按钮点击时,加载数据并重置遍历索引:
submit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 加载库存数据到集合 stockDataList = loadStockData(); // 重置遍历索引 currentIndex = -1; // 可选:自动显示第一条记录(如果有数据的话) if (!stockDataList.isEmpty()) { currentIndex = 0; Stock firstStock = stockDataList.get(currentIndex); idTextField.setText(firstStock.getStockId()); nameTextField.setText(firstStock.getProductName()); quantityTextField.setText(String.valueOf(firstStock.getStockQuantity())); } else { JOptionPane.showMessageDialog(null, "未查询到任何库存记录!"); // 清空TextField idTextField.setText(""); nameTextField.setText(""); quantityTextField.setText(""); } } });
为什么原来的代码只显示最后一条?
你之前的代码大概率是在Next按钮的事件里,每次点击都重新执行查询,然后直接遍历整个ResultSet,循环里不断覆盖TextField的值,最后自然就只剩下最后一行的数据了。而缓存到集合后,我们通过索引精准控制每次显示哪一行,完美解决这个问题。
内容的提问来源于stack exchange,提问作者style237
相关产品推荐
相关产品推荐

