我想在运行时将数据添加到我自己的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[]>();
如何制作
答案 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)
由于您没有包含表格模型的完整源代码,因此有点难以分辨您正在做什么,因此我将在此处做一些假设。
您可能正在推广AbstractTableModel
或DefaultTableModel
。在任何一种情况下,您都不必通过构造函数将数据添加到模型中。相反,您需要覆盖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();
}
或使用案例陈述。同样的想法。