如何使用tableModel

时间:2015-07-20 08:19:00

标签: java swing arraylist abstracttablemodel

我有一个名为Student的对象,在这个对象中我有一个包含材料的对象的arrayList(名称,注释)

Public Class Student{
private String StudentFirstName;
private String StudentLastName;
private List<Material> materials;

}  
public Class Material{
String String materialName;
String Float note;

}

我想在Jtable中显示所有数据:

StudentFirstName :杰克 StudentLastName :杜邦 materialName :数学注释:15 StudentFirstName :杰克 StudentLastName :杜邦 materialName :法语注释:12 StudentFirstName :杰克 StudentLastName :杜邦 materialName :数学注释:15 StudentFirstName :杰克 StudentLastName :杜邦 materialName :运动笔记:10

StudentFirstName :彼得 StudentLastName :sanchez materialName :数学注释:14 StudentFirstName :彼得 StudentLastName :sanchez materialName :法语注释:17 StudentFirstName :彼得 StudentLastName :sanchez materialName :阿拉伯语注释:11

这是我的表模型

package com.orange.tableModel;
public class DataTableModel extends AbstractTableModel {
String[] entete = {"StudentFisrtName", "StudentLastNameName", 
"Mat    erialName", "MaterialNote"};
List<Student> allStudents;
public DataTableModel() {
allStudents = new ArrayList<>();

}

@Override
public int getRowCount() {
    return allStudents.size();

}

@Override
public int getColumnCount() {
    return entete.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

    switch (columnIndex) {
        case 0: {
           return allStudents.get(rowIndex).getStudentFirstName();

        }
        case 1: {
            return allStudents.get(rowIndex).getStudentLastName();

        }
        case 2: {

            return allStudents.get(rowIndex).materials(rowIndex).getMaterialName();
        }
        case 3: {
            return allStudents.get(rowIndex).materials(rowIndex).getNote();
        }

        default:
            throw new IllegalArgumentException();
    }

}

@Override
public String getColumnName(int column) {

    return entete[column];
}

}

Jtable dataTable=new Jtable();
dataTable.setModel(new DataTableModel());     `

结果是:

StudentFirstName :杰克 StudentLastName :杜邦 materialName :数学注释:15

StudentFirstName :彼得 StudentLastName :sanchez materialName :数学注释:14

1 个答案:

答案 0 :(得分:0)

我会做这样的事情:

首先,方法是getRowCount()

returns allStudents.size()

实际上这个值是2,所以你告诉你的DataTableModel你的表包含2行而且不正确。 尝试修改此方法做类似的事情:

@Override
public int getRowCount() {
  int row_count=0;
  for (int i=0; i<allStudents.size(); i++) {
    row_cont+=allStudents.get(i).getMaterials().size();
} 

通过这种方式,您将强制jtable包含您需要的行数。接下来,您应该编写一个更智能的方法getValueAt。您应该维护一个变量(例如count_row),该变量告诉您​​有多少行专用于同一个Student并对其进行控制,例如

if (count_row< allStudents.get(rowIndex).getMaterials().size()) {
  //show information of the same Student but with materials(count_row)
}

或类似的东西。简而言之,您告诉您的jTable显示相同的学生,直到显示每个材料。

您可以通过另一种方式解决此问题:您应该创建一个包含冗余数据的ArrayList,例如执行类似的操作

Student A_B=new Student("A","B","Math",12);    //first_name, last_name, subject, note
Student A_B=new Student("A","B","History",4);
Student B_C=new Student("B","C","Geograph",10);

希望这对你来说是一个有用的提示。嗨!!