点击选择JTable行后删除触发ArrayIndexOutOfBoundsException异常的解决咨询
解决JTable删除行时的ArrayIndexOutOfBoundsException异常
这个问题我之前也踩过坑,核心是你搞混了业务账号ID和List集合的索引的区别!你的错误代码里,把表格第一列的账号ID直接当成了bank.getAccounts()这个List的索引来取值,但这俩完全不是一回事——List的索引是从0开始的存储位置序号,而账号ID是业务里的独立标识,比如账号ID是2,但List里可能只有1个元素,这时候调用get(2)自然就会抛出2>=1的越界异常。
下面给你几个靠谱的解决思路,按需选择:
直接用选中行索引操作List(适合表格和List一一对应时)
如果你的JTable是直接基于bank.getAccounts()这个List渲染的,没有做过滤、排序,那可以直接用选中的行索引去取List里的元素,然后删除:if(row >= 0) { // 直接用选中的行索引获取List中对应的账号对象 Account account = bank.getAccounts().get(row); bank.removeAccount(account); // 关键:删除后要更新表格模型,不然界面不会同步刷新 ((DefaultTableModel)table_1.getModel()).removeRow(row); }转换视图行到模型行(适合表格有排序/过滤时)
如果你给JTable加了排序或者过滤功能,那界面上选中的行索引(视图行)和表格模型里的行索引(对应List的顺序)可能不一致,这时候需要先转换:if(row >= 0) { // 把界面选中的行转成模型里的行索引 int modelRow = table_1.convertRowIndexToModel(row); Account account = bank.getAccounts().get(modelRow); bank.removeAccount(account); ((DefaultTableModel)table_1.getModel()).removeRow(modelRow); }通过业务ID查找删除(适合ID和List索引无关时)
如果你的业务场景必须用账号ID来定位删除,那不要直接用ID当索引,而是遍历List找到对应ID的对象:if(row >= 0) { String idStr = table_1.getModel().getValueAt(row, 0).toString(); int accountId = Integer.parseInt(idStr); // 遍历集合找到对应ID的账号 Account targetAccount = null; for(Account acc : bank.getAccounts()) { if(acc.getId() == accountId) { targetAccount = acc; break; } } if(targetAccount != null) { bank.removeAccount(targetAccount); // 同步删除表格里的对应行 ((DefaultTableModel)table_1.getModel()).removeRow(row); } }
总结一下:永远不要假设业务ID等于集合的存储索引,这是新手很容易犯的逻辑错误,搞清楚两者的区别问题就解决了。
内容的提问来源于stack exchange,提问作者scheebler
相关产品推荐
相关产品推荐

