我正在研究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);
}
}
}
答案 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}}。这些方法返回模型索引。