繁体   English   中英

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

[英]Java Jtable error with setting a value to a column after listener runs

我正在为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);  
    }
 }

}

下面的行将获取选定的行索引,该索引是视图索引,因为您从JTable实例询问了这一点:

int rowcount = jDetailSubmitTable.getSelectedRow();

稍后,您可以使用此视图索引为模型建立索引:

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

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

int selrowid = jDetailSubmitTable.getSelectedRow();
selrowid = jDetailSubmitTable.convertRowIndexToModel(selrowid);
[...]jDetailSubmitTable.getModel().getValueAt(selrowid, com)[...]

在SO上的这个答案中 ,我对视图与模型以及转换索引的需求进行了较长的解释。


更新: @camickr正确地观察到您应该使用TableModelEvent附带的数据,即TableModelEvent.getFirstRow()TableModelEvent.getLastRow()TableModel.getColumn() 这些方法返回模型索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM