2013-05-19 3 views
0

나는 임베디드 데이터베이스를 사용하여 항목의 이름을 쿼리하고 JList에 넣습니다. 프로그램이 실행되면 목록에 잘 채워집니다.JList를 DefaultListModel로 업데이트

populateList()이라는 목록을 초기화하고 새로 고치는 기능을 만들었습니다. 여기

내 코드의 관련 부분은 다음과 같습니다

public class GUI extends JFrame{ 
    private int maxBankNr; 
    private BankAccountDAO bankAccountDAO; 
    private DBManager dbm; 
    ... 

    public GUI(){ 
     initComponents(); //sets up the Swing GUI 
     this.dbm = new DBManager(); 
     this.bankAccountDAO = dbm.getBankAccountDAO(); 
     ... 

     populateList(); 

    } 

    private void populateList(){ 
     updateAll = false; //this seems to stop baAccountListValueChanged from throwing an exception 
     this.maxBankNr = bankAccountDAO.getMaxBankNr(); //max number of bank accounts in database 
     BankAccount ba; 
     DefaultListModel dlm = new DefaultListModel(); 

     baAccountList.setModel(dlm); 

     for(int i = 1; i <= this.maxBankNr; i++){ 
      ba = bankAccountDAO.getBankAccount(i); 

      dlm.addElement(ba.getName()); 
     } 

    updateAll = true; 
} 
... 

private void baRefreshButtonActionPerformed(java.awt.event.ActionEvent evt){             
    populateList(); 
} 

... 

내 문제는 프로그램이 시작될 때 populateList() 잘 작동하지만,이 baRefreshButtonActionPerformed에서 호출 될 때, 아무것도 할 것으로 보인다. 목록은 정확히 동일하게 유지됩니다.

벡터를 사용하여 JList.setListData()을 사용하고, 모든 관련 컨테이너의 유효성을 다시 검사하고 유효성을 검사하고 다시 칠하는 등 여러 가지 방법을 시도했습니다. 나는 또한 다른 유형의 ListModel을 사용해 보았습니다.

또한 fireContentsChanged()이 작동해야한다고 읽었지만 DefaultListModel은 허용하지 않으므로 어쨌든 자동으로 호출됩니다.

수정 프로그램을 찾는 데 많은 시간을 할애했지만, 내가 방문한 대부분의 사이트는 내가 시도한 것과 동일한 것을 말합니다.

나는이 정보가 충분하기를 바랍니다. 다른 것을 알 필요가 있으면 알려주세요, 감사합니다. D

그것은 전혀 내 의 ListModel와는 아무 상관이 없었다,하지만 내 BankAccountDAO 클래스 :

편집 나는 결국 내 구호에 많은이를 해결하기 위해 관리했다. 다음과 같이 내가) 게터를 getMaxBankNr을 (변경

package com.accounts; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class BankAccountDAO { 
private String insertBankAccountSQL = 
     "INSERT INTO accounts.bankaccounts(bankNr, sortCode, accountNumber, balance, interest, details, name) " + 
     "VALUES (?, ?, ?, ?, ?, ?, ?)"; 

private String getBankAccountSQL = 
     "SELECT bankNr, sortCode, accountNumber, balance, interest, details, name " + 
     "FROM accounts.bankaccounts WHERE bankNr = ?"; 

private Connection conn = null; 
private PreparedStatement pstmt = null; 
private int maxBankNr = 0; 

public BankAccountDAO(Connection theConn){ 
    this.conn = theConn; 

    try{ 
     this.pstmt = conn.prepareStatement(getBankAccountSQL); 

     Statement stmt = conn.createStatement(); 

     ResultSet rs = stmt.executeQuery("SELECT MAX(bankNr) FROM accounts.bankaccounts"); 

     if(rs.next()){ 
      maxBankNr = rs.getInt(1); 

     } 

     rs.close(); 
     stmt.close(); 
    }catch(SQLException se){ 
     printSQLException(se); 
    } 
} 

public int getMaxBankNr(){  
    return(this.maxBankNr); 
} 

public void insertBankAccount(int bankNr, int sortCode, int accountNumber, double balance, double interest, String details, String name){ 
    PreparedStatement ins = null; 

    try{ 
     ins = conn.prepareStatement(insertBankAccountSQL); 
     ins.setInt(1, bankNr); 
     ins.setInt(2, sortCode); 
     ins.setInt(3, accountNumber); 
     ins.setDouble(4, balance); 
     ins.setDouble(5, interest); 
     ins.setString(6, details); 
     ins.setString(7, name); 

     ins.execute(); 
    }catch(SQLException se){ 
     printSQLException(se); 
    } 
} 

public BankAccount getBankAccount(int targetBankNr){ 
    BankAccount ba = null; 

    try{ 
     pstmt.clearParameters(); 
     pstmt = conn.prepareStatement(getBankAccountSQL); 
     pstmt.setInt(1, targetBankNr); 

     ResultSet rs = pstmt.executeQuery(); 

     if(rs.next()){ 
      int bankNr = rs.getInt("bankNr"); 
      int sortCode = rs.getInt("sortCode"); 
      int accountNumber = rs.getInt("accountNumber"); 
      double balance = rs.getDouble("balance"); 
      double interest = rs.getDouble("interest"); 
      String details = rs.getString("details"); 
      String name = rs.getString("name"); 

      ba = new BankAccount(bankNr, sortCode, accountNumber, balance, interest, details, name); 

     } 

     rs.close(); 
    }catch(SQLException se){ 
     printSQLException(se); 
    } 

    return ba; 
} 

private void printSQLException(SQLException se){ 
    while(se != null){ 

     System.out.print("SQLException: State: " + se.getSQLState()); 
     System.out.println("Severity:   " + se.getErrorCode()); 
     System.out.println(se.getMessage()); 

     se = se.getNextException(); 
    } 
} 
} 

: 이것은 이전 버전입니다

public int getMaxBankNr(){ 
    try{ 
     Statement stmt = conn.createStatement(); 

     ResultSet rs = stmt.executeQuery("SELECT MAX(bankNr) FROM accounts.bankaccounts"); 


     if(rs.next()){ 
      maxBankNr = rs.getInt(1); 

     } 
    }catch(SQLException e){ 
     printSQLException(e); 
    } 

    return(this.maxBankNr); 
} 

이 this.maxBankNr = bankAccountDAO.getMaxBankNr()가 호출, 그것은 년후 업데이트 된 maxBankNr을 반환합니다. 올바른 값을 반환하려면 새 SQL 문이 필요합니다.

나와 같은 방식으로 목록이있는 데이터베이스를 사용하는 사용자 (인터넷 검색을하는 동안 나와 같은 문제가있는 사람이 많음) for 루프 은 반복 횟수를 알고 있어야합니다.

나는 이것을 답변으로 올렸지 만 충분한 점수가 없기 때문에 8 시간 동안 내 자신의 질문에 대답 할 수 없습니다.

+3

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 의심 스러울 때는 인쇄하십시오! 'System.out.println (thing.toString())'에 대한 호출을 잘하면 많은 통증을 줄일 수 있습니다. 또는 IDE의 디버거를 사용하여 코드를 단계별로 실행하십시오. 3) 프레임 또는 기타 최상위 컨테이너를 확장하지 마십시오. 대신 하나의 인스턴스를 만들고 사용하십시오. –

답변

-1

일반적으로 당신은 apropriate로 변경된 데이터의 JList의 객체를 알리기 위해 다음 방법 중 하나를 호출해야합니다 :

fireContentsChanged(Object source, int index0, int index1) 
fireIntervalAdded(Object source, int index0, int index1) 
fireIntervalRemoved(Object source, int index0, int index1) 

API doc for AbstractListModel을 확인하시기 바랍니다.

+1

DefaultListModel에는 필요하지 않습니다. –

+0

사실 당신 말이 맞습니다. DefaultListModel는 fireXXX 메서드를 내부적으로 적절하게 호출합니다. 감사. –

+0

다른 경우에는 좋은 답변이지만, EDT에 대해 생각한 이유는 (d) efects :-) 또는 baAccountList.setModel (dlm); 생성자 또는 void에서 마지막 코드 줄이어야합니다. – mKorbel

0

음 ... 힘든 문제입니다.그 자체로 populateList()가 작동하면 그 baRefresButtonActionPerformed 자체가 실행되고 있지 않은 것 같습니다.

보통 ActionEventActionPerformed을 청취자로 사용하거나 출력에 어떤 종류의 출력을 넣을 것입니다. 예를 들어, baRefreshButtonActionPerformed과 같이 무시가 실행되었음을 나타내는 팝업 상자가 표시되도록하십시오.

해피 코딩!

+0

감사 Galen Nare :) ** System.out.println() ** 및 ** baRefreshButtonActionPerformed **는 확실히 호출되고 있습니다. – kyul