我有一个包含 3 列的 jtable,即第一个值、第二个值和总计。我的表格是可编辑的。因此,在运行时,我的firstvalue 和secvalue 列以值0.0 启动。现在,用户必须在 2 个 culumn 单元格中的任意一个中输入一个值,同一行中的总计列必须显示这 2 个数字中的一些数字,而无需单击任何按钮 我尝试使用 TableCellLister 但它在所有带有“TableCellListener”键的行上都给出错误 这是我的代码
Action myaction = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
TablecellListener tblisten = (TableCellListener)e.getSource();
int row = tblisten.getRow();
int col = tblisten.getColumn();
Integer secondcol = 1;
Integer totalcol = 2;
int sum;
//get value
Integer fval = (Integer)table.getModel().getValueAt(row, col);
Integer sval = (Integer)table.getModel().getValueAt(row, scol);
//find the sum
//set value
table.setvalueAt(sum,row,totalcol);
}
}
提前致谢
您需要写一个
TableModel
。
例如:
public class MyTableModel extends AbstractTableModel {
static class RowModel {
double firstValue;
double secondValue;
public RowModel(double firstValue, double secondValue) {
this.firstValue = firstValue;
this.secondValue = secondValue;
}
};
private final List<RowModel> rows = new ArrayList<>();
public void addRow(double firstValue, double secondValue) {
int pos = rows.size();
rows.add(new RowModel(firstValue, secondValue));
fireTableRowsInserted(pos, pos);
}
@Override
public int getRowCount() {
return rows.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
case 1:
case 2:
return Double.class;
}
return null;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "First value";
case 1:
return "Second value";
case 2:
return "Total";
}
return null;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex < 0) {
switch (columnIndex) {
case 0:
return "First value";
case 1:
return "Second value";
case 2:
return "Total";
}
} else if (rowIndex >= 0 && rowIndex < rows.size()) {
RowModel row = rows.get(rowIndex);
switch (columnIndex) {
case 0:
return row.firstValue;
case 1:
return row.secondValue;
case 2:
return row.firstValue + row.secondValue;
}
}
return null;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return rowIndex >= 0 && rowIndex < rows.size()
&& columnIndex >= 0 && columnIndex <= 1;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (rowIndex >= 0 && rowIndex < rows.size()) {
RowModel row = rows.get(rowIndex);
switch (columnIndex) {
case 0:
row.firstValue = toDouble(aValue);
fireTableCellUpdated(rowIndex, columnIndex);
fireTableCellUpdated(rowIndex, 2);
break;
case 1:
row.secondValue = toDouble(aValue);
fireTableCellUpdated(rowIndex, columnIndex);
fireTableCellUpdated(rowIndex, 2);
break;
}
}
}
private double toDouble(Object aValue) {
if (aValue instanceof Number) {
return ((Number)aValue).doubleValue();
} else if (aValue instanceof String) {
try {
return Double.parseDouble((String)aValue);
} catch (NumberFormatException e) {
// return 0;
}
}
return 0;
}
}
然后创建模型的实例并将其附加到
JTable
:
MyTableModel model = new MyTableModel();
table.setModel(model);
model.addRow(0,0);
model.addRow(0,0);
model.addRow(0,0);