在侦听器运行后将值设置为列的Java Jtable错误

时间:2016-10-28 20:59:41

标签: java swing netbeans jtable

我正在研究JTable的TableModelListener。现在jtable可以获得很好的价值。但是当它归结为设置所选行的最后一列的值时。它变得不稳定,不确定错误是什么,它只是挂起。没有看到netbeans上的任何错误,所以不知道该怎么想。因此,我甚至不确定if语句是否在设置值方面起作用。我应该使用或做其他事情吗? 更新:它似乎是一个无限循环。将代码编辑为建议,以检查更新表事件,但仍然遇到相同的问题。 以下是代码:

public  class MyListener implements TableModelListener {

    @Override
    public void tableChanged(TableModelEvent tme) { 

     if (tme.getType() == TableModelEvent.UPDATE)
        {
           int rowcount = jDetailSubmitTable.getSelectedRow();

           // Initial return when table is starting to be filled.
        if(rowcount == -1 )
        {
            return;
        }

        int com = tme.getColumn();

        // Number being Validated.
        if(jDetailSubmitTable.getModel().getValueAt(rowcount, com).toString().trim().isEmpty())
        {
            JOptionPane.showMessageDialog(null, "Invaid Number selected.");
            jDetailSubmitTable.getModel().setValueAt("0", rowcount, com);
            return;
        }
        try
        {
          Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, com).toString().trim());
        }
        catch(NumberFormatException e)
        {
            JOptionPane.showMessageDialog(null, "Invaid Number selected.");
            jDetailSubmitTable.getModel().setValueAt("0", rowcount, com);
            return;
        }


        // Adjusted amount is calculated below.

        double nur = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 9).toString().trim());
        double our = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 8).toString().trim());
        double diff = nur - our;
        double nunits = Double.parseDouble(jDetailSubmitTable.getModel().getValueAt(rowcount, 11).toString().trim());
        double ans = diff * nunits;

        jDetailSubmitTable.getModel().setValueAt(ans, rowcount, 12);  
    }
 }

}

1 个答案:

答案 0 :(得分:2)

以下行将获取所选行索引,该索引为 view 索引,因为您从v6.9.1实例询问此内容:

JTable

稍后您使用此视图索引来索引模型:

int rowcount = jDetailSubmitTable.getSelectedRow();

您应首先使用JTable.convertRowIndexToModel将此视图索引转换为模型索引:

jDetailSubmitTable.getModel().getValueAt(rowcount, com)

我对视图与模型以及在this answer上转换索引的需求提供了更长的解释。

更新: @camickr正确地指出您应该使用TableModelEvent附带的数据,即TableModelEvent.getFirstRow()TableModelEvent.getLastRow()和{{ 3}}。这些方法返回模型索引。