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