0

埋め込みデータベースを使用してエントリの名前をクエリし、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、許可されていないことを読みましたが、とにかく自動的に呼び出されると確信しています。

私は修正を探すのに何時間も費やしました.私が訪れたほとんどのサイトは、私が試したのと同じことを言っていますが、どれも機能していません.

これで十分な情報だと思います。他に何か知っておく必要がある場合はお知らせください。ありがとうございます。

編集 私は最終的にこれを修正することができました。

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時間自分の質問に回答できません。

4

2 に答える 2

-1

通常、次のメソッドのいずれかを呼び出して、変更されたデータを適切に JList オブジェクトに通知する必要があります。

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

AbstractListModel の API ドキュメントを確認してください。

于 2013-05-19T11:08:00.940 に答える