Java点击JTable行实现数量递减、最小值自动删行方案
问题现象
- 点击Swing表格选中行时,对应行的数量字段会直接重置为1,不符合交互预期
- 目标效果:每次点击选中行时对应行的数量递减1,当数量降至最小值时自动移除该选中行
- 当前基于
AbstractTableModel实现表格数据管理,鼠标点击事件的现有代码如下:
private void OrderListMouseClicked(java.awt.event.MouseEvent evt) { OrderTableModel model = (OrderTableModel) OrderList.getModel(); Order order = new Order(); int row = OrderList.getSelectedRow(); int currentqty = (int) (model.getValueAt(row, 2)); order = model.getOrderAt(row); for (int i=currentqty - 1; i>=1; i--){ currentqty = i; } order.setQuanity(currentqty); model.update(order);

故障原因
代码中写的for循环是完全冗余的错误逻辑:只要当前数量大于1,循环会从currentqty-1逐次遍历到1,最终直接把currentqty赋值为1,这就是每次点击后数量直接跳成1的根本原因。另外原代码没有做选中行有效性校验,也没有实现数量归零时的行移除逻辑。
修复代码
直接删除冗余的for循环,补充边界判断和行删除逻辑即可,修复后的实现参考:
private void OrderListMouseClicked(java.awt.event.MouseEvent evt) { OrderTableModel model = (OrderTableModel) OrderList.getModel(); int row = OrderList.getSelectedRow(); // 拦截点击表格空白区域的无效场景,避免索引越界异常 if (row < 0) { return; } Order order = model.getOrderAt(row); int currentqty = (int) model.getValueAt(row, 2); // 每次点击仅做一次减1计算,不需要循环 currentqty--; if (currentqty < 1) { // 数量归零,移除对应行 model.removeRow(row); } else { order.setQuanity(currentqty); model.update(order); } }
补充说明:你需要在自定义的OrderTableModel类中实现removeRow(int rowIndex)方法,删除内部数据存储列表中对应索引的元素后,调用fireTableRowsDeleted(rowIndex, rowIndex)通知表格组件刷新UI,否则删除操作不会同步到界面显示。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

