You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:39:18