抽象表模型

时间:2010-07-10 20:14:53

标签: java swing

我在使用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!

2 个答案:

答案 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