【问题标题】:Java Jtable error with setting a value to a column after listener runs侦听器运行后将值设置为列的 Java Jtable 错误
【发布时间】:2016-11-01 14:35:25
【问题描述】:

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

}

【问题讨论】:

    标签: java swing netbeans jtable


    【解决方案1】:

    以下行将获取选定的行索引,该索引是 view 索引,因为您从 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 上的 this answer 中转换索引的需要进行了更长的解释。


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

    【讨论】:

    • 您不应该使用 getSelectedRow() 方法。代码正在 TableModelListener 中执行。您应该使用 TableModelEvent 中的值,如解决循环问题的原始答案中所示。
    猜你喜欢
    • 2014-10-10
    • 2013-01-28
    • 2012-09-04
    • 2011-08-16
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多