6

我有一个 JComboBox,它的值是通过网络检索的。

我正在寻找一种方法向用户表明这一事实,当用户想要查看列表时,展开下拉列表,然后检索数据。

基本要求包括:

  1. JComboBox 的下拉菜单不应锁定 EDT,但组合的操作在有值之前不应起作用。
  2. 用户应该知道何时检索到所有数据。
  3. 指示的大小(UI 房地产)应尽可能小。

请注意,在用户想要查看组合值(即展开下拉列表)之前,不会检索数据。

我使用的解决方案:

我用 aSwingWorker来保持 UI 响应。组合框是使用 JIDE 和 JIDE 覆盖的Overlayable,JIDEInfiniteProgressPanel会听取工作人员的声音。

4

3 回答 3

7

为避免锁定 EDT,您的数据检索应在后台线程中完成。我会使用 SwingWorker 来查找和加载值,因为这使得后台线程与其他好东西可用,这使得它对 Swing 非常友好。我会让 JComboBox 启用属性false,直到所有值都已加载,然后通过setEnabled(true). 您将知道 SwingWorker 是通过其done()方法完成的(通过覆盖它),或者通过将 PropertyChangeListener 添加到 SwingWorker 并在其状态为 时收到通知SwingWorker.StateValue.DONE

用户知道该过程已完成的一种方法是,他们将看到组合框何时重新启用。如果您想要一个更明显的指示器,您可以显示一个 JProgressBar 或一个 ProgressMonitor。如果您希望 GUI 外观基本保持不变,这可以显示在对话框中。

于 2011-12-26T15:11:38.997 回答
3

我通过在 JComboBox 周围添加“正在加载...”项和特殊边框来实现它。单击时,单独的线程开始通过 SwingUtilities.invokeAndWait 添加新项目。加载完成后,“正在加载...”最后一项将被删除。

于 2011-12-27T08:23:29.967 回答
1

为了不强迫我的用户等到加载数据,请结合 eel 和 stan 的答案:-)

  • 从包含零个或一个实值加上虚拟条目“加载”的模型开始
  • 注册一个 PopupMenuListener 并启动一个 SwingWorker 在它的第一个 menuWillBecomeVisible 中加载数据(到一个单独的数据结构中,可能是一个新模型)
  • 加载时,选择虚拟条目(和/或任何其他适合通知用户正在发生的事情),该操作还必须注意“还没有做任何事情”
  • 听取工人的意见,当收到 DONE 时,将数据替换/填充到组合的模型中
于 2011-12-27T11:51:33.190 回答