如何动态添加一行

how can I add a row dynamically

我想动态添加行而不干扰 table 中的其他数据(数据硬编码在 Object[][] dataForTable 中。不想将数据保存在数据库中)。我没有从 TableModel 或 Table 本身找到任何方法来这样做。有没有什么方法可以在不替换 Object[][] dataForTable 或任何其他方式的情况下实现这一目标?

我还有其他情况。任何时候我都希望 Table 中多出一行为空。当将值放入该行时,将动态创建另一个空行。

更新: 我重新评估了这个答案,它包含一些错误和概念性问题。我们决定将 add/remove 行的选项从 Table 添加到 DefaultTableModel。所以你可以只使用 ((DefaultTableModel)table).addRow("Col1", "Col2", "Col3");只需确保列数与 table 列数完全匹配。

原回答如下:

默认的 table 模型不是 mutable 这可能是我们的疏忽。像这样的东西应该可以工作(尚未测试):

public class MyTableModel implements TableModel {
    private ArrayList<Object[]) data;
    private String[] columnNames;
    private EventDispatcher dispatcher = new EventDispatcher();
    private boolean editable;

    public MyTableModel(String[] columnNames, Object[][] data) {
        this(columnNames, data, false);
    }

    public MyTableModel(String[] columnNames, Object[][] data, boolean editable) {
        this.data = new ArrayList<Object[]>();
        for(Object[] o : data) {
            this.data.add(o);
        }
        this.columnNames = columnNames;
        this.editable = editable;
    }

    /**
     * @inheritDoc
     */
    public int getRowCount() {
        return data.length;
    }

    /**
     * @inheritDoc
     */
    public int getColumnCount() {
        return columnNames.length;
    }

    /**
     * @inheritDoc
     */
    public String getColumnName(int i) {
        return columnNames[i];
    }

    /**
     * @inheritDoc
     */
    public boolean isCellEditable(int row, int column) {
        return editable;
    }

    /**
     * @inheritDoc
     */
    public Object getValueAt(int row, int column) {
        try {
            return data.get(row)[column];
        } catch(ArrayIndexOutOfBoundsException err) {
            // not the best situation but quite useful for the resource editor
            //err.printStackTrace();
            return "";
        }
    }

    /**
     * @inheritDoc
     */
    public void setValueAt(int row, int column, Object o) {
        data.get(row)[column] = o;
        dispatcher.fireDataChangeEvent(column, row);
    }

    /**
     * @inheritDoc
     */
    public void addDataChangeListener(DataChangedListener d) {
        dispatcher.addListener(d);
    }

    /**
     * @inheritDoc
     */
    public void removeDataChangeListener(DataChangedListener d) {
        dispatcher.removeListener(d);
    }

    public void addRow(Object[] row) {
       data.add(row);
       dispatcher.fireDataChangeEvent(-1, row);
    }

}