1

データベースで毎秒新しく挿入された行をチェックするプログラムがあり、新しいレコードが見つかった場合は、listModelをクリアし、データベースからすべてのデータを再度取得して、リストに再表示する必要があります。

    itemListModel.clear();

    ArrayList resultArrayList = DBQueries.getAllSubmittedSaleTransaction();
    Iterator iterate = resultArrayList.iterator();

    int i = 0;
    while (iterate.hasNext()) {
        Hashtable data = (Hashtable) iterate.next();            
        itemListModel.add(i, data);

        this.itemList.addNotify();
        this.itemList.validate();
        this.itemList.repaint();

        i++;
    }
    this.validate();
    this.repaint();

ただし、問題は、再ペイント方法が機能しない場合があることです。これを達成するための賢い方法はありますか?

前もって感謝します

4

1 に答える 1

4

fireContentsChanged(...)モデルを更新する場合、特に新しいデータが追加された後にモデルが呼び出される場合は、JListを再描画する必要はありません。必ずSwingイベントスレッドでのみモデルを変更してください。

あなたが

  • SwingWorkerでデータベースクエリを実行します。
  • PropertyChangeListenerをSwingWorkerに追加します
  • SwingWorkerのstateプロパティがに変更されSwingWorker.StateValue.DONEたら、GUIにSwingWorkerから新しいデータを取得させ、EDTにListModelを入力させます
  • 次に、ListModelにそのfireContentChanged(...)メソッドを起動させます。
  • ListModelはAbstractListModelを拡張する必要があります。
  • DefaultListModelを使用できる場合は、DefaultListModelがメソッドを呼び出すため、メソッドを呼び出す必要がないことに注意してfireContent....()ください。
于 2013-02-18T03:17:26.803 に答える