1

これは私のコードです。変数 bq は BasicQuery と呼ばれるカスタム クラスであり、JavaDB 接続を返します... AutoCompleteDecorator は、オートコンプリート機能を実装するために使用される swingX ライブラリのクラスです...このコードは約 3 回正常に実行されますが、その後フリーズし続け、しばらくするとメモリ不足の例外がスローされます! 問題がどこにあるのかわかりません。誰でも私を助けてもらえますか?また、コードの他の部分が必要な場合はお知らせください。

private void initCombos()
{
    ResultSet r=bq.executeQuery("select productID,productName from products");
    cmbProductID.removeActionListener(this);
    cmbProductID.removeActionListener(this);

    try
    {
        cmbProductID.removeAllItems();
        cmbProductName.removeAllItems();
        cmbCodes.removeAllItems();
        String s1;
        while(r.next())
        {
            s1=r.getString(1).trim();
            cmbProductID.addItem(s1);
            cmbCodes.addItem(s1);
            cmbProductName.addItem(r.getString(2).trim());
        }
        r.close();
        cmbProductID.addActionListener(this);
        cmbProductName.addActionListener(this);
        AutoCompleteDecorator.decorate(cmbProductID);
        AutoCompleteDecorator.decorate(cmbProductName);
    }
    catch(Exception x)
    {
        JOptionPane.showMessageDialog(this,"Error setting up ComboBoxes "+x);
    }
}

4

2 に答える 2

2

このセクションで:

ResultSet r=bq.executeQuery("select productID,productName from products");
cmbProductID.removeActionListener(this);
cmbProductID.removeActionListener(this);

私はあなたが意味すると思います:

ResultSet r=bq.executeQuery("select productID,productName from products");
cmbProductID.removeActionListener(this);
cmbProductName.removeActionListener(this);

そうしないと、イベント ハンドラーが開いたままにcmbProductNameなり、メモリ リークが発生します。

于 2010-02-13T16:10:09.127 に答える
2

私が見る2つの問題があります。@ニック・カーバーは1つ指摘しました(+1)。cmbProductName間違いなく意図したとおりにActionListener を削除しないと、 ResultSet.

2 つ目は、ペイント スレッドで重い作業を行っているように見えることです。通常、db 呼び出しはワーカー スレッドで行う必要があり、GUI をペイントするタスクのみをペイント スレッドで行う必要があります。そうしないと、このスレッドがブロックされ、アプリケーションの動作が遅くなります。このトピックの詳細については、 SwingWorkerと Swing の同時実行に関する概念を参照してください。

于 2010-02-13T16:34:32.900 に答える