将数组加载到Java表

这真让我抓狂。 我阅读了Sun关于使用默认数据模型创建基本表的教程,但是无法找到一个关于如何加载数据对象数组的简单示例:

class dataObject{ String name; String gender; Byte age; public dataObject (String name, String gender, Byte age){ this.name = name; . . } 

然后我创建,例如,这个东西的矢量:

 Vector v = new Vector(99); v.addElement(new dataObject("Marrie", "Female", 33); v.addElement(new dataObject("John", "Male", 32); 

使用dataObject我会收集信息,现在我怎么在表中显示它? 因为这不起作用:

 JTable newTable = new Jtable(v, header) // header is another Vector. 

我收到一些错误,导致我走到最后一行。 所以,任何帮助,甚至是很少的帮助都是令人沮丧的。 我知道有几个关于这个问题的线索,但是那些人已经对JTable + TableModel如何工作感到厌烦,我几乎得不到它。

非常感谢。

有两种方法可以使用基本的准备数据集创建JTable:

  1. 一个2D Object数组
  2. 一个Vector其元素是Vector

所以你可以这样做:

  Object [][] model = {{"Marrie", "Female","33"},{"John","Male","32"}}; JTable table = new JTable(model); 

或者你可以这样做:

  Vector model = new Vector(); Vector row = new Vector(); row.add("Marrie"); row.add("Female"); row.add("33"); model.add(row); row = new Vector(); row.add("John"); row.add("Male"); row.add("32"); model.add(row); JTable table = new JTable(model); 

下一步是实现您自己的TableModel以利用您放在一起的DataObject类(请注意,Java类以大写字母开头)。 扩展AbstractTableModel使生活变得简单,因为您只需要实现三个方法即可开始:

 public int getRowCount(); public int getColumnCount(); public Object getValueAt(int row, int column); 

前两个很容易,你可以得到你的Vector大小的行数和硬编码列的列数。 getValueAt是从DataObject提取数据的地方

这是一个使用匿名类的示例,扩展了AbstractTableModel

 final Vector myDataObjects = new Vector(); myDataObjects.add(...);// add your objects JTable table = new JTable(new AbstractTableModel() { public int getRowCount() {return myDataObjects.size();} public int getColumnCount() { return 3; } public Object getValueAt(int row, int column){ switch (column) { case 0: return myDataObjects.get(row).getName(); case 1: return myDataObjects.get(row).getGender(); case 2: return myDataObjects.get(row).getAge(); default: return ""; } } }); 

我保留了Vector ,以使其接近当前的实现。 您可以轻松地将此更改为此示例中的ArrayList,而无需担心。

问题是,你正在使用的构造函数被设计为持有一个包含其他向量的向量。

每一个都有信息。

请参阅此工作示例以更好地理解它:

 import javax.swing.*; import java.util.Vector; public class TableDemo { public static void main( String [] args ){ Vector> data = new Vector>(); Vector row = new Vector(); row.add( "Marie"); row.add( "Female"); row.add( 33); data.add(row); Vector otherRow = new Vector(); otherRow.add( "John"); otherRow.add( "Male"); otherRow.add( 32 ); data.add(otherRow); Vector headers = new Vector(); headers.add("Name"); headers.add("Gender"); headers.add( "Age"); JTable table = new JTable( data, headers ); JFrame frame = new JFrame(); frame.add( new JScrollPane( table )); frame.pack(); frame.setVisible( true ); } } 

这创造了:

像这样的东西http://img695.imageshack.us/img695/2032/capturadepantalla201006r.png

为了以防万一,你应该看看这个:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

如果你还没有完成。

您无法将数据对象加载到DefaultTableModel中。 您需要创建一个自定义TableModel来执行此操作。 Bean Table Model就是这样一个模型,可以让您更轻松地完成此过程。

我之前从未使用过JTable,但文档说构造函数将“Vector of Vectors”作为第一个参数,而不是dataObjects的Vector。

我知道很多人可能会担心包含另一个jar文件,但说实话,无论JTable(或JList或JComboBox)有多简单,我总是使用GlazedLists库。 坦率地说,这是你将要使用的最令人惊叹的库之一。 它非常非常灵活。 但是一个简单的例子包括将bean放入一个名为EventList的特殊列表中。 然后构造一个表格式; 通过将格式绑定到数据列表来创建模型,然后将其设置为表的模型。

假设你有一个Person类:

 public class Person { private String firstName; private String surname; private int age; ... standard constructors, getters and setters... } 

现在,让您的表格显示这些人的列表:

 EventList peopleEventList = new BasicEventList(); peopleEventList.add(... create some objects and add it the usual way ...); ... String[] columnProperties = { "firstName", "surname", "age" }; String[] columnLabels = { "First name", "Surname", "Age" }; TableFormat personTableFormat = GlazedLists.tableFormat(columnProperties, columnLabels); EventTableModel personTableModel = new EventTableModel(peopleEventList, personTableFormat); myJTable.setModel(personTableModel); 

我是从记忆中写的,但我认为这或多或少是正确的。 使用这个库的好处是很容易向表中添加排序和过滤。 首先获取基本表格,然后开始查看GlazedLists网站,看看还能做些什么。 还有一些非常好的截屏video 。

PS我与这个图书馆没有任何联系,我只是认为它是摇滚!