如何让我的 jtable 单元格监听值变化

问题描述 投票:0回答:1

我有一个包含 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);
}
}

提前致谢

java swing
1个回答
0
投票

您需要写一个

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);
© www.soinside.com 2019 - 2024. All rights reserved.