2017-02-03 9 views
1

SchoolYearモデルリストの要素が適切に

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上で何を参照するには、プログラムを実行したとき

enter image description here

しかし、私は、行2の値になるように見える私のJComboBoxで2つの値を取得

enter image description here

ご覧のとおり、リストのサイズを取得して、格納されているオブジェクトの数を確認しようとしました。だから私はオブジェクトがこのコードブロックの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; 
      } 
     }); 

どのような考えですか?

ありがとうございました。

+2

あなたはその後、 'List'が繰り返さに追加されているデータベースから、それぞれの結果によって更新されてされて、あなたの' getAllSchoolYearStart'方法でSchoolYear' 'の単一のインスタンスを使用しているが、それはまだです同じインスタンス。代わりに、 'while(rs.next()){'ループの中に 'SchoolYear'の新しいインスタンスを作成してください。 – MadProgrammer

+0

[なぜ、私のArrayListはリストに最後に追加されたN個のコピーを含んでいますか?](http: /stackoverflow.com/questions/19843506/why-does-my-arraylist-contain-n-copies-of-the-last-item-added-to-the-list) – 4castle

答えて

3

SchoolYearインスタンスを1つだけ作成しています。あなたはそれを行うので、listには1つの参照のみがあります。あなたの現在のSchoolYear schoolyearをコメントアウトしてループに移動することができます。また、ループ内の新しいローカル変数を宣言するだけです。

while(rs.next()){ 
    SchoolYear sy = new SchoolYear(); 
    sy.setStart(rs.getInt("yearFrom")); 
    list.add(sy); 
} 
+0

私の悪い。私はシーケンスをチェックするのにもっと時間を費やしていたはずです。この質問を申し訳ありません。しかし、ありがとう。 – p3ace

関連する問題