簡體   English   中英

用DefaultListModel更新JList

[英]updating JList with DefaultListModel

我正在使用嵌入式數據庫查詢條目的名稱,並將其放在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 ,它顯得無能為力。 該列表保持不變。

我曾嘗試很多不同的方法,如使用Vector,使用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()的吸氣劑如下:

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個小時內回答自己的問題。

嗯...這很難。 我認為,如果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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM