首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JList更新DefaultListModel

用JList更新DefaultListModel
EN

Stack Overflow用户
提问于 2013-05-19 10:57:44
回答 2查看 1.9K关注 0票数 0

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

我已经创建了一个函数,用于初始化和刷新名为populateList()的列表。

下面是我代码的相关部分:

代码语言:javascript
复制
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

这与我的BankAccountDAO类与我的ListModel一点关系都没有。这是旧版本:

代码语言:javascript
复制
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更改如下:

代码语言:javascript
复制
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);
}

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

任何以与我相同的方式使用带有列表的数据库的人(我注意到有相当多的人在谷歌搜索时遇到了与我一样的问题),应该确保for循环确实知道循环多少次。

我会把这个作为答案,但我不能回答我自己的问题8个小时,因为我没有足够的分数。

EN

回答 2

Stack Overflow用户

发布于 2013-05-19 11:10:36

嗯..。这是一次艰难的考验。我认为,如果populateList()自己工作,那么baRefresButtonActionPerformed本身就不会被执行。

我会尝试使用常规的ActionEventActionPerformed作为侦听器,或者将某种类型的输出放入其中,比如baRefreshButtonActionPerformed,让它显示一个弹出框,说明重写已经执行。

编码愉快!

票数 0
EN

Stack Overflow用户

发布于 2013-05-19 11:08:00

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

代码语言:javascript
复制
fireContentsChanged(Object source, int index0, int index1)
fireIntervalAdded(Object source, int index0, int index1) 
fireIntervalRemoved(Object source, int index0, int index1)

请查一下用于AbstractListModel的API文档

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16633891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档