我如何使用arraylist将我的数据存储在JTable的预定义默认表模型中

时间:2012-11-07 17:09:11

标签: java swing jtable

我想在运行时将数据添加到我自己的JTable模型中。我有我的界面上的表格和添加按钮。据我所知,我不能用二维数组做,并希望在我的自定义表模型中使用Arraylist但我不知道如果我使用这种类型的数据如何使构造函数。

static String[] columnNames = {"A", "B", "C"};
static Object data[][] = new Object[15][3];

public MyTableModel() {
   super(data, columnNames);
}

这是两个dimansional数组的数据构造函数,但我想使用:

ArrayList<Object[]> data = new ArrayList<Object[]>();

如何制作

3 个答案:

答案 0 :(得分:4)

一种方法是使用AbstractTableModel。这是一个例子:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    public static class MyModel extends AbstractTableModel {

        private List<Object[]> data;
        private List<String> columnNames;

        public MyModel(List<String> columnNames, List<Object[]> data) {
            super();
            this.columnNames = columnNames;
            this.data = data;
        }

        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public int getColumnCount() {
            return columnNames.size();
        }

        @Override
        public String getColumnName(int column) {
            return columnNames.get(column);
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data.get(rowIndex)[columnIndex];
        }

    }

    protected void initUI() {
        JFrame frame = new JFrame(TestTable.class.getSimpleName());
        List<String> columns = Arrays.asList("Name", "Age");
        List<Object[]> data = new ArrayList<Object[]>();
        for (int i = 0; i < 50; i++) {
            Object[] value = new Object[2];
            value[0] = "Name-" + i;
            value[1] = 12 + i;
            data.add(value);
        }
        JTable table = new JTable(new MyModel(columns, data));
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }
}

如果您需要修改data List<Object[]>,请不要忘记触发相应的表格事件。 AbstractTableModel已包含所有内容。

答案 1 :(得分:0)

由于您没有包含表格模型的完整源代码,因此有点难以分辨您正在做什么,因此我将在此处做一些假设。

您可能正在推广AbstractTableModelDefaultTableModel。在任何一种情况下,您都不必通过构造函数将数据添加到模型中。相反,您需要覆盖TableModel扩展程序中的以下方法:

getRowCount()

getColumnCount()

getValueAt(int row, int column)

使这些方法中的每一个都索引到您的ArrayList<Object[]> data对象中 - 例如,getValueAt(row,column)应返回类似data.get(row)[column]的内容。然后将TableModel添加到JTable,只要显示自定义数据就可以了。

现在......当您data更改时(您更改了表格中的单元格值或添加/删除了行数),您只需在fireTableDataChanged()上调用TableModel即可(假设它已扩展AbstractTableModel或其子类之一)。这将强制UI使用您对基础data所做的更改进行更新。

答案 2 :(得分:0)

创建自己的表模型最直接的方法是从AbstractTableModel继承。然后至少覆盖getRowCount,getColumnCount和getValueAt。

然后,您可以使用“new JTable(mymodel)”创建表,其中“mymodel”是您创建的模型的实例,或者您可以使用“new JTable”创建它,然后再执行setModel将模型附加到JTable。

例如 - 虽然我已经完成了这么多次,但是我正在写这篇文章,所以没有任何明示或暗示的保证,可能有一个语法错误或两个在那里:

class ArrayListModel extends AbstractTableModel
{
  ArrayList<Object[]> list;

  public ArrayListModel(ArrayList<Object[]> list)
  {
    this.list=list;
  }
  public int getRowCount()
  {
    return list.size();
  }
  public int getColumnCount()
  {
    if (list.size()==0)
    {
      return 0;
    }
    else
    {
      return list.get(0).length;
    }
  }
  public Object getValueat(int row, int column)
  {
    return list.get(row)[column];
  }
}

... somewhere else ...
ArrayListModel mymodel=new ArrayListModel(somedata);
JTable mytable=new JTable(mymodel);
... etc ...

旁注:当我第一次学习Java时,我认为创建JTable的“正常”方法是使用默认模型,创建向量矢量或二维数组,然后填充。我认为创建自己的模型将是你在罕见的奇怪案例中所做的事情。但我已经发现默认模型只是罕见的简单情况下的最佳方式。现在我几乎总是创建自己的模型:它通常更容易编码并且更容易理解。通常我有一个我用特定字段创建的类的ArrayList,然后在我的模型类中我有类似的东西:

 public Object getValueAt(int row, int col)
 {
   Whatever w=list.get(row);
   if (col==0) return w.foo;
   else if (col==1) return w.bar;
   else if (col==2) return w.plugh;
   else throw SomeException();
 }

或使用案例陈述。同样的想法。