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