使用DefaultListModel更新JList



我使用嵌入式数据库来查询条目的名称并将其放在JList中。当程序运行时,列表被很好地填充。

我已经做了一个函数,应该初始化和刷新列表称为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类有关。这是旧版本:

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();
    }
}
}

我已经改变了getMaxBankNr() getter如下:

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);
}

, 。maxBankNr = bankAccountDAO.getMaxBankNr()被调用时,它没有返回更新的maxBankNr。这需要一个新的SQL语句返回正确的值。

任何像我一样使用列表数据库的人(我注意到很多人在搜索时和我有同样的问题)都应该确保for循环真的知道要循环多少次。

我本来可以把这个贴出来作为一个答案,但是我不能回答我自己的问题8个小时,因为我没有足够的分数

嗯…这是一个棘手的问题。我认为,如果populateList()自己工作,baRefresButtonActionPerformed不会自己执行。

我会尝试一个常规的ActionEventActionPerformed作为一个监听器或把某种输出在它,如baRefreshButtonActionPerformed,有它显示一个弹出框说覆盖已经执行。

编码快乐!

通常您应该调用以下方法之一来通知JList对象已更改的数据:

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

请查看API文档中的AbstractListModel。

相关内容

  • 没有找到相关文章

最新更新