0

JTableイベントディスパッチスレッドとは別のスレッド内で一定の間隔で aのいくつかのセルを更新する必要があります。他のセルは、イベント ディスパッチ スレッドによってのみ更新できるため、2 つのスレッドが同じセルを更新することはありません。

のデータを変更したら、JTableを呼び出しfireTableRowsUpdated()て を再描画するのが一般的な方法ですJTable。通常fireTableRowsUpdated()はイベントディスパッチスレッド内で呼び出しますが、別のスレッド内で呼び出すことはできますか? もしそうなら、fireTableRowsUpdated()スレッドセーフでもありますか? JTable同時に更新される可能性があります。

4

2 に答える 2

3

JTableのドキュメントから:

警告: Swing はスレッドセーフではありません。詳細については、Swing のスレッド ポリシーを参照してください。

これは以下にリンクしています。

一般に、Swing はスレッドセーフではありません。すべての Swing コンポーネントと関連クラスは、特に記載されていない限り、イベント ディスパッチ スレッドでアクセスする必要があります。

そして、あなたの質問の要点は次のとおりです。

この制限は、Swing コンポーネントにアタッチされたモデルにも適用されます。たとえば、TableModel が JTable にアタッチされている場合、TableModel はイベント ディスパッチ スレッドでのみ変更する必要があります。

さて、たまたま、このポリシーに違反する多くのことを実行しても問題を解決できる場合があります。しかし、 SwingWorkerを簡単に作成して、コードスレッドセーフであることを保証できるのに、なぜそんなことをするのでしょうか?

于 2013-05-17T16:56:40.427 に答える
2

実行をイベント ディスパッチャー スレッドに渡すだけの場合は、SwingUtilities.invokeLater()代わりに使用します。SwingWorker

SwingUtilities.invokeLater の詳細

于 2013-05-17T18:22:35.037 に答える