我在使用AbstractTableModel时面临一个问题,我使用链表作为数据的容器,我从数据库中获取表中的记录,然后我把它放在表模型的链表中,然后是我的jable.setModel(模型)。问题我面对的是,我从db中从表中获取的最后一条记录重复了n次,因为n是数据库中的记录数。 当我制作model.getIndextOF(anAppointmentDate);每次返回0,所以我认为每次将对象插入到同一个地方?我可能错了,但我认为 public class appointmentModel扩展AbstractTableModel {
List<appointmentDate> patientAppointment;
public appointmentModel() {
patientAppointment = new LinkedList<appointmentDate>(); // linked list
}
public int getRowCount() {
return patientAppointment.size();
}
public int getColumnCount() {
return 2;
}
public String getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return patientAppointment.get(rowIndex).getDateOFAppointment();
} else if (columnIndex == 1) {
return patientAppointment.get(rowIndex).getTimeOfAppointment();
} else {
return "Not found";
}
}
public String getColumnName(int column) {
if (column == 0) {
return "date";
} else if (column == 1) {
return "time";
} else {
return "not found";
}
}
public void insertRecord(appointmentDate anAppointmentDate)
{
list.add(anAppointmentDate);
fireTableRowsInserted(list.size()-1, list.size()-1);
System.out.println(list.indexOf(anAppointmentDate)); // each time it prints 0
}
////////// 在这里我使用模型
while (resultSet.next()) {
N_Date= resultSet.getDate("appointDate");
anAppointment.setDateOFAppointment(N_Date);
N_time = resultSet.getString("appointTime");
anAppointment.setTimeOfAppointment(N_time);
tableModel.insertRecord(anAppointment);
}
jTable.setModel(tableModel);
我的输出是所有表记录中重复的最后一条记录,plz help!
答案 0 :(得分:1)
发现了问题!
您没有在“使用模型的位置”周围显示足够的代码,但看起来您正在为每个插入重用相同的对象。你有这个对象,你可以根据数据库中的内容设置它的属性,然后将它存储在列表中。
好好猜测:每次都是同一个对象,所以每次都有相同的值!如果您希望列表中包含不同的值,则需要使用不同的对象。别担心,这是一个常见的初学者错误。
一种明智的方法是为每个数据库记录构建一个new appointmentDate
。您可能希望在构造函数中初始化数据。
最后请注意,如果appointmentDate
是一个类名,它应该(按照惯例)以大写字母开头!
最后(更多):LinkedList
在插入时效率很高,但在检索时表现可怕,即get(n)
。我希望列表中的滚动和显示比插入要多得多,因此我会使用List
实现,其效果要好得多:ArrayList
。它的工作原理相同,插入时速度稍慢,检索速度更快。但这只是为您提供的额外信息。对于像这样的小项目,性能并不那么重要。
答案 1 :(得分:1)
您对AppointmentDate
对象使用相同的引用,并仅更改其内部状态。
因此,每次将相同的对象添加到列表中。因此,在最后一次循环迭代中,您可以将列表中的所有对象设置为包含最后一行的数据。
要解决此问题,请在每次循环迭代中实例化new AppointmentDate()
:
while (resultSet.next()) {
AppointmentDate anAppointment = new AppontmentDate();
// the rest is the same
}
另请注意,班级名称应以大写字母开头 - 即AppointmentDate
,而不是appointmentDate
。