【问题标题】:Load an array to a Java table将数组加载到 Java 表
【发布时间】:2010-06-22 03:10:32
【问题描述】:

这快把我逼疯了。我阅读了 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 的工作原理感到喘不过气来,我只是勉强明白。

非常感谢。

【问题讨论】:

    标签: java jtable


    【解决方案1】:

    您可以通过两种方式使用已准备好的基本数据集创建 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 的大小以获取行数,并硬编码 val 以获取列数。 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,而无需担心。

    【讨论】:

    • 查看您和支持人员的代码,我相信拥有一个“数据对象”是微不足道的。数据只是被放入填充数组的模型中,然后通过模型访问。
    • 我同意,在这个例子中,它是一个非常简单的数据结构。这里只是为了展示如何使用自定义对象支持TableModel 中的一行。
    【解决方案2】:

    问题是,您使用的构造函数旨在保存一个包含其他向量的向量。

    每一个都有信息。

    查看此工作示例以更好地理解它:

    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

    如果你还没有完成。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我以前从未使用过 JTable,但文档说构造函数将“向量的向量”作为第一个参数,而不是数据对象的向量。

        【讨论】:

          【解决方案5】:

          我知道很多人可能对包含另一个 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 我与这个图书馆没有任何关系,我只是觉得它很棒!

          【讨论】:

            猜你喜欢
            • 2011-05-16
            • 1970-01-01
            • 2014-08-20
            • 2021-07-23
            • 1970-01-01
            • 2013-03-30
            • 1970-01-01
            • 2021-12-01
            • 2012-11-05
            相关资源
            最近更新 更多