【问题标题】:how can I add a row dynamically如何动态添加一行
【发布时间】:2016-02-20 13:41:19
【问题描述】:

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

我还有其他情况。在任何时候,我都想在表格中增加一个空行。并且在将值放入该行时,将动态创建另一个空行。

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    更新:我重新评估了这个答案,其中包含一些错误和概念问题。我们决定在DefaultTableModel 中添加从表中添加/删除行的选项。所以你可以只使用 ((DefaultTableModel)table).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);
        }
    
    }
    

    【讨论】:

    • 它可以动态添加行,但与getValueAt(int row, int column)setValueAt(int row, int column, Object o) 存在问题。方法getValueAt(int row, int column) 仅抛出异常ArrayIndexOutOfBoundsException 一次,setValueAt(int row, int column, Object o) 方法有时也会在尝试添加/更改单元格中的值时为其他单元格设置值。试图找出原因。
    • 如果您不明白,只需发布​​一个问题,突出显示堆栈跟踪和有问题的行。
    • 我需要 fireDataChangeEvent(int index, int type)EventDispacher.class 方法的一点背景知识。 setValueAt(int row, int column, Object o) 方法的dispatcher.fireDataChangeEvent(column, row); 行中的indextype 如何与表的列和行相关。与 addRow(Object[] row) 方法中的 dispatcher.fireDataChangeEvent(-1, row); 相同。
    • 这两种方法都出问题了。
    • 我认为列可能需要为 0 而不是 -1。 fireDataChangeEvent 用于通知视图(Table)模型的变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2014-07-27
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多