【发布时间】:2017-06-20 08:36:28
【问题描述】:
学年模型
public class SchoolYear {
int id;
int start;
int end;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
}
SchoolYearDaoImpl类方法
public List<SchoolYear> getAllSchoolYearStart() {
String SQL = "{CALL getAllSchoolYearInfo()}";
SchoolYear schoolyear = new SchoolYear();
List<SchoolYear> list = new ArrayList<>();
try(Connection con = DBUtil.getConnection(DBType.MYSQL);
CallableStatement cs = con.prepareCall(SQL);){
try(ResultSet rs = cs.executeQuery();){
while(rs.next()){
schoolyear.setStart(rs.getInt("yearFrom"));
list.add(schoolyear);
}
JOptionPane.showMessageDialog(null,list.size());
for(int x=0; x<list.size(); x++){
JOptionPane.showMessageDialog(null,((SchoolYear)list.get(x)).getStart());
}
}
}catch(SQLException e){
JOptionPane.showMessageDialog(null,e.getMessage());
}
return list;
}
我通过调用存储过程getAllSchoolYearInfo() 获得的结果集显示了 yearFrom 列的 2 行。
但是,当我运行程序查看我的 GUI 上的内容时,我在 JComboBox 中获得了 2 个值,这似乎是第 2 行的值 2015
如您所见,我尝试获取列表的大小以查看存储了多少对象。所以我猜这可能是在这段代码中对象如何存储和累积到List<SchoolYear>的问题。
try(ResultSet rs = cs.executeQuery();){
while(rs.next()){
schoolyear.setStart(rs.getInt("yearFrom"));
list.add(schoolyear);
}
JOptionPane.showMessageDialog(null,list.size());
for(int x=0; x<list.size(); x++){
JOptionPane.showMessageDialog(null,((SchoolYear)list.get(x)).getStart());
}
}
或者问题出在我的ListCellRenderer 上?我不这么认为。
jcmbSchoolYearStart.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value instanceof SchoolYear){
SchoolYear schoolyear = (SchoolYear) value;
setText(""+schoolyear.getStart());
}
return this;
}
} );
有什么想法吗?
谢谢。
【问题讨论】:
-
您在
getAllSchoolYearStart方法中使用SchoolYear的单个实例,该实例由数据库中的每个结果更新,然后重复添加到List,但是它仍然是同一个实例。相反,在while(rs.next()){循环中创建SchoolYear的新实例