Java JTable单元格未更新

Java JTable单元格未更新,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我刚上高中,对编程还不熟悉。我正在完成我的第一项任务,遇到了一个问题。我到处找了,但没有找到任何帮助。我已经编写了一个gui,它接受JTable中的输入和输出数据。一切看起来都很好,只是当我输入新的输入时,表不会更新,即之前显示的日期不会更改为新值。我怀疑下面显示的AbstractTableModel的实现是导致故障的原因,因为我只是不知道如何覆盖isCellEditable和setValueAt方法。有人可以请作出必要的更正,并给我任何额外的信息,将帮助我完成我的项目?如果您能尽快回复我,我将

我刚上高中,对编程还不熟悉。我正在完成我的第一项任务,遇到了一个问题。我到处找了,但没有找到任何帮助。我已经编写了一个gui,它接受JTable中的输入和输出数据。一切看起来都很好,只是当我输入新的输入时,表不会更新,即之前显示的日期不会更改为新值。我怀疑下面显示的AbstractTableModel的实现是导致故障的原因,因为我只是不知道如何覆盖isCellEditable和setValueAt方法。有人可以请作出必要的更正,并给我任何额外的信息,将帮助我完成我的项目?如果您能尽快回复我,我将不胜感激

ps.nh和vh是整数数组,proc_1和proc_是字符串数组,该表被添加到jtabbedpane中,如果这很重要

public class TableModel extends AbstractTableModel  {
    int numRows;
    String colNames[] = { "NH", "Horse Names", "VH",
                          "Proc. I", "Proc. II" };
    TableModel()  {
        super();
        numRows = fnh;
    }   

    @Override
    public int getRowCount()  {
       return numRows;
    }

    @Override
    public int getColumnCount()  {
        return 5;
    }

    @Override
    public String getColumnName( int c ) {
        return colNames[c];
    }

    @Override
    public Object getValueAt( int r, int c )  {
        if ( c == 0 ) 
            return nh[r];
        else if ( c == 1 )
            return hNam[r];
        else if ( c == 2 )
            return vh[r] ;
        else if ( c == 3 )
            return proc_1[r];
        else 
            return proc_2[r];    
    }   

    @Override
    public boolean isCellEditable( int r, int c )  {
        return true;
    }

    @Override
    public void setValueAt( Object v, int r, int c )  {
        fireTableCellUpdated( r, c );
    }
}
  • setValueAt(…)
    方法在模型中不设置任何值。它所做的只是启动一个通知方法,其他什么都不做
  • 此外,您的模型基本上是无用的,因为它没有数据“核心”,没有任何东西来保存它应该保存的数据。通常这是一个集合,例如ArrayList
  • 我认为你需要重新阅读JTable教程

这里您的
设置值应该如下所示

public void setValueAt( Object v, int r, int c )  {
    if ( c == 0 ) 
        nh[r] = (Integer)v;
    else if ( c == 1 )
        hNam[r] = (String)v;
    else if ( c == 2 )
        vh[r] = (Integer)v;
    else if ( c == 3 )
        proc_1[r] =(String)v;
    else 
        proc_2[r] =(String) v;
    fireTableCellUpdated( r, c );
}

在你的项目完成之后。阅读以在oracle官方网站上完成
JTable
教程。在那里,您将全面了解如何正确使用
JTable
。以下是教程链接:

您的数据值在哪里?包含表数据的数组。。!!伟大的莱姆斯。肯定会派上用场的。谢谢!!!是的,正如我所说的,我不知道怎么做。@user2143292:阅读教程。你不能只是编造这些东西。你已经读过但不明白,否则你就不会在这里寻求帮助了…?我不明白。为什么表第一次显示时保存了正确的输出?@user2143292:我自己,如果我需要“尽快”完成类似的操作,我会使用DefaultTableModel,我已经为列添加了一个字符串数组,只需通过调用它的
addRow(…)
方法来添加行。通过搜索这个网站,可以找到很多这样的例子。非常感谢Vishal。让我试试,我很快会给你回复,好吗?请密切关注此帖子。:-)嘿,伙计,你能解释一下为什么表格第一次显示的数据是正确的吗?v是保存新数据的对象吗?我如何填充它?首先你告诉我这是为你做的?关于你的另一个问题,我只有在看到你的完整代码后才能回答。你有什么错误?顺便说一下,谢谢你的链接。对于初学者来说,它看起来棒极了。以后一定会用的。如果你能给我更直接的帮助,那就太好了:-)我没有任何错误。