将数组加载到Java表

时间:2010-06-22 03:10:33

标签: java jtable

这让我发疯了。我阅读了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如何工作感到喘不过气来,我只是勉强得到它。

非常感谢。

5 个答案:

答案 0 :(得分:4)

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

  1. 一个2D Object数组
  2. Vector,其元素为Vector
  3. 所以你可以这样做:

     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我与这个图书馆没有任何关系,我只是认为它是摇滚!