2011-07-12 8 views
1

私はJTableのモデルとしてサブクラスAbstractTableModelを使用しました。データが追加されるたびに、AWTスレッドでfireTableRowsInserted()を呼び出します。私の基になるコンテナへのすべてのアクセスは、synchronizedメソッドを使用してスレッドセーフになります。非AWTスレッドのAbstractTableModelでデータを更新するためのベストプラクティス

このパターンはこれまでのところうまく機能しています。しかし今、リストからデータを削除したいと思っています。スレッドの問題があることに気付きました。行を削除してAWTスレッドでfireTableRowsDeleted()を呼び出すと、行インデックスの呼び出しはまだgetValueAt()になりましたが、もう存在しなくなりました。

AWTスレッド外のテーブルモデルで操作を実行する場合のベストプラクティスは何ですか?

+0

これは、(上書きする)メソッドがAbstractTableModelの中にあり、かつメソッドがFireXxxXxxの場合にモデルの外から呼び出されるかどうかに依存しますが、両方のモデルでaddRowとremoveRowの間に違いは見られないので(モデルとビューも) – mKorbel

答えて

5

ベストプラクティスIMHOはそれを避けることです。 Runnable内の別のスレッドからモデルへのアクセスをすべてラップし、SwingUtilities.invokeLaterを使用してモデルを更新します。

+0

+1、同じ思考プロセス。 – mre

+0

EDTの基本事項+1 – mKorbel

1

EDTからデータを削除する必要があります。 AbstractTableModelで変更イベントを発生させる操作は、EDTで行う必要があります。

関連する問題