6

ネット全体で値が取得されるJComboBoxがあります。

ユーザーがリストを見たいときにドロップダウンを展開すると、その事実をユーザーに示す方法を探しています。その場合にのみ、データが取得されます。

基本的な要件は次のとおりです。

  1. JComboBoxのドロップダウンはEDTをロックしないはずですが、値が存在するまでコンボのアクションは機能しません。
  2. ユーザーは、すべてのデータがいつ取得されたかを知る必要があります。
  3. 表示のサイズ(UI不動産)はできるだけ小さくする必要があります。

ユーザーがコンボの値を確認する(つまり、ドロップダウンリストを展開する)まで、データは取得されないことに注意してください。

私が使用したソリューション:

SwingWorkerUIの応答性を維持するためにを使用しました。コンボボックスは、JIDEとワーカーをリッスンするOverlayableJIDEを使用してオーバーレイInfiniteProgressPanelされました。

4

3 に答える 3

7

EDT のロックを回避するには、データの取得をバックグラウンド スレッドで行う必要があります。SwingWorker を使用して値を見つけてロードします。これにより、Swing に非常に適した他の機能を備えたバックグラウンド スレッドが利用できるようになるためです。すべての値が読み込まれるまでJComboBox を有効falseにしてから、 を介して有効にしsetEnabled(true)ます。SwingWorker は、メソッドを介してdone()(オーバーライドすることにより) 実行されるか、PropertyChangeListener を SwingWorker に追加して状態が になったときに通知を受けることで実行されSwingWorker.StateValue.DONEます。

プロセスが完了したことをユーザーが知る方法の 1 つは、コンボ ボックスが再度有効になったことを確認することです。より明確なインジケータが必要な場合は、JProgressBar または ProgressMonitor を表示できます。GUI の外観をほとんど変更しない場合は、ダイアログに表示できます。

于 2011-12-26T15:11:38.997 に答える
3

「Loading...」項目と JComboBox の周りに特別な境界線を追加して実装しました。クリックすると、別のスレッドが開始され、SwingUtilities.invokeAndWait を介して新しいアイテムが追加されます。読み込みが完了すると、「読み込み中...」の最後の項目が削除されます。

于 2011-12-27T08:23:29.967 に答える
1

データがロードされるまでユーザーを待たせないようにするには、eel と stan による回答を組み合わせてください :-)

  • ゼロまたは 1 つの実数値とダミー エントリ "loading" を含むモデルから始めます。
  • PopupMenuListener を登録し、最初の menuWillBecomeVisible でデータを (別のデータ構造に、新しいモデルである可能性があります) ロードする SwingWorker を開始します。
  • ロード中に、ダミー エントリ (および/または何が起こっているかをユーザーに通知するのに適切なもの) を選択します。アクションは、「まだ何もしていない」ことも認識している必要があります。
  • コンボのモデルにデータを置き換える/埋める DONE を受け取ったら、ワーカーに耳を傾けます
于 2011-12-27T11:51:33.190 に答える