DefaultComboBoxModelを使用して、アプリ内のさまざまなJComboBoxのデータを管理しています。
データの読み込み中または再読み込み中は、これらのコンボボックスを無効にします(または、「読み込み中...」というテキストを表示して、ポインターを砂時計に設定します)。
モデルがデータをリロードしていることをJComboBoxに通知する方法はありますか?
リロードは別のスレッドで発生しています。
にAbstractListModel
は、と呼ばれる関数がありますaddListDataListener(ListDataListener l)
。これで、メソッドが呼び出されたときに通知される独自のリスナーを実装できますfireContentsChanged(Object source, int index0, int index1)
(これはバックグラウンドで実行されるため、これを行う必要はありません)。
更新が終了するまで、 JComboBoxからすべてのリスナーを削除します(1つの無効)
GlassPaneを表示し、JLabelに説明を追加します(マウスイベントのみを消費することに注意してください。キーボードからのイベントをオーバーライドする必要があります)または(使用する方がよい)JLayer for Java7に基づいて、JXLayer (Java6)
すべてのデータの読み込みが終了した場合は、すべてのリスナーをJComboBox(es)に追加し直します(1つのvoid)
バックグラウンドタスクにSwingWorkerを使用しsetEnabled(false)
、SwingWorkerのバックグラウンドスレッドの実行中にJComboBoxを呼び出し、スレッドが完了したらJComboBoxを再度有効にします。これは、SwingWorkerにPropertyChangeListenerを追加して、その状態プロパティをリッスンし、StateValue.DONEになったときに通知を受けることで判断できます。モデル自体は、Swingイベントスレッドでのみ更新する必要があることに注意してください。したがって、たとえば、データがデータベースから着信している場合は、バックグラウンドスレッドでデータベースから情報を取得しますが、それをイベントスレッドのコンボボックスのモデルに渡します。SwingWorkerのプロセス/公開メソッドのペアはこれを行うための良い方法です。