我有一个名为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
答案 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);
希望这对你来说是一个有用的提示。嗨!!