【问题标题】:Final row in a Jtable can not be removed无法删除 Jtable 中的最后一行
【发布时间】:2025-12-24 14:55:17
【问题描述】:

我有以下代码,允许我通过单击从右侧 Jtable 中删除一行。它适用于所有行,除非只剩下一行。顺便说一句,很抱歉大多数名字都是葡萄牙语,这是我的母语。这是在我单击表格中的最后一行之前和之后显示的图像。它更新总数,但行仍然存在。对于其他所有情况,它都可以完美运行。

截图:

private void jtbSelecionadosMouseClicked(java.awt.event.MouseEvent evt)                                             
{                                                 
    int x = jtbSelecionados.rowAtPoint(evt.getPoint());
    if (x >= 0) 
    {
        String nomeProduto = (String)jtbSelecionados.getModel().getValueAt(x, 0);

        for (int i = 0; i < itensVenda.size();i++)
        {
            if (itensVenda.get(i).getNomeProduto().equals(nomeProduto))
            {
                if(itensVenda.get(i).getQtd() > 1)
                {


                    valorTotal -= (itensVenda.get(i).getPreco() / itensVenda.get(i).getQtd());
                    double precototal = itensVenda.get(i).getPreco();
                    double unit = precototal / itensVenda.get(i).getQtd();
                    System.out.println("Unidade: "+unit+"\nTotal: "+precototal);
                    itensVenda.get(i).setPreco(itensVenda.get(i).getPreco() - (itensVenda.get(i).getPreco() / itensVenda.get(i).getQtd()));
                    itensVenda.get(i).setQtd(itensVenda.get(i).getQtd() - 1);

                    recarregarTabela();
                }
                else if(itensVenda.get(i).getQtd() <= 1)
                {

                    valorTotal -= itensVenda.get(i).getPreco() / itensVenda.get(i).getQtd();


                    itensVenda.remove(i);
                    recarregarTabela(); 
                }

            }

        }
    }    

使用新信息重置表的函数:

private void recarregarTabela()
{

    if (itensVenda.size() == 0)
    {   
        dtm.getDataVector().removeAllElements();
        dtm.setRowCount(0);
        lblTotal.setText("Total: R$" + String.valueOf(valorTotal));
    }
    else
    {

        dtm.getDataVector().removeAllElements();
        dtm.setRowCount(0);
        for (Item item : itensVenda)
        {

            Object[] vetor = new Object[3];
            vetor[0] = item.getNomeProduto();
            vetor[1] = item.getQtd();
            vetor[2] = String.format("%.2f", item.getPreco());
            System.out.println(item.getPreco());
            dtm.addRow(vetor);
        }
        lblTotal.setText("Total: R$" + String.valueOf(valorTotal));
    }
}   

【问题讨论】:

  • 请参阅:*.com/questions/38227729/… 以获取允许您删除一个(或多个)选定行的示例。
  • 我可以删除行,只是在只剩下一行的时候不行
  • 那你就不能删除行了!!!最后一行与第一行没有什么不同,除了你的逻辑对待它的方式不同,所以修正你的逻辑。你已经得到了一个有效的例子。从示例中学习。

标签: java swing defaulttablemodel


【解决方案1】:

您不必在每次删除单行时重新构建整个模型。由于您已经拥有单击或选定行的索引,您可以使用 removeRow(index) 方法将其从模型中删除。我怀疑dtmDefaultTableModel,所以每次需要从表中删除行时只需调用dtm.removeRow(index)

【讨论】:

  • 我试过了,它适用于一切,除了只有一行时,和我做的一样 =/
  • 我将其更改为当前方式,因为这种方式行不通,但事实证明另一种方式也行不通
  • @SalomãoAndrade:那么您将要创建并发布一个minimal reproducible example 并附上您的问题。请阅读链接。
  • (1+) 建议使用 removeRow(...) 方法。 @SalomãoAndrade,I changed it to the current way because that way wasnt working, - 这是错误的方法。当您使用removeRow(...) 方法时,从DefaultTableModel 中删除一行是一个语句。我不知道你为什么要使用其他任何东西。
  • 我尝试了其他方法,因为我认为我的方法有问题,现在就换回去