如何动态添加行

时间:2015-03-17 13:39:46

标签: codenameone

我希望动态添加行而不会干扰表中的其他数据(数据在Object[][] dataForTable中进行硬编码。不想在数据库中保留数据)。我没有从TableModel或Table本身找到任何方法来执行此操作。是否有任何方法可以在不替换Object[][] dataForTable或其他任何方式的情况下实现此目的?

我有其他情况。在任何时候我都想在表中添加一个空行。将值添加到此行时,将动态创建另一个空行。

1 个答案:

答案 0 :(得分:1)

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

以下原始答案:

默认表模型不可变,这可能是我们的遗漏。这样的事情应该可行(尚未测试):

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);
    }

}