这让我发疯了。我阅读了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如何工作感到喘不过气来,我只是勉强得到它。
非常感谢。
答案 0 :(得分:4)
有两种方法可以使用基本的准备数据集创建JTable:
Object
数组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<DataObject> myDataObjects = new Vector<DataObject>();
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,而无需担心。
答案 1 :(得分:3)
问题是,你正在使用的构造函数被设计为包含一个包含其他向量的向量。
每一个都有信息。
请参阅此工作示例以更好地理解它:
import javax.swing.*;
import java.util.Vector;
public class TableDemo {
public static void main( String [] args ){
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object> row = new Vector<Object>();
row.add( "Marie");
row.add( "Female");
row.add( 33);
data.add(row);
Vector<Object> otherRow = new Vector<Object>();
otherRow.add( "John");
otherRow.add( "Male");
otherRow.add( 32 );
data.add(otherRow);
Vector<String> headers = new Vector<String>();
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 );
}
}
创造了:
something like this http://img695.imageshack.us/img695/2032/capturadepantalla201006r.png
以防万一,你应该看看这个:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
如果你还没有完成。
答案 2 :(得分:1)
您无法将数据对象加载到DefaultTableModel中。您需要创建一个自定义TableModel来执行此操作。 Bean Table Model就是这样一个模型,可以让您更轻松地完成此过程。
答案 3 :(得分:0)
我之前从未使用过JTable,但是文档说构造函数将“Vector of Vectors”作为第一个参数,而不是dataObjects的Vector。
答案 4 :(得分:0)
我知道很多人可能会担心包含另一个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<Person> peopleEventList = new BasicEventList<Person>();
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站点以查看您还可以执行哪些操作。还有一些非常好的screencasts。
PS我与这个图书馆没有任何关系,我只是认为它是摇滚!