【问题标题】:How to indicate that a JComboBox is loading values?如何指示 JComboBox 正在加载值?
【发布时间】:2011-12-26 15:08:40
【问题描述】:

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

我正在寻找一种方法向用户表明这一事实,当用户想要查看列表时,展开下拉列表,只有在此数据才会被检索。 p>

基本要求包括:

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

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

我使用的解决方案:

我使用了SwingWorker 来保持 UI 响应。组合框使用 JIDE 的 Overlayable 和 JIDE 的 InfiniteProgressPanel 覆盖,用于监听工作人员。

【问题讨论】:

    标签: java swing jcombobox event-dispatch-thread jide


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我已经编辑了这个问题 - 只有在请求时才应该填写值,所以启用/禁用不是我想要的。对话也不合适。至于 SwingWorker - 我会使用一个,但问题是使用它来驱动什么 UI
    • 仅在请求时填写? 请求如何?
    • 第一次打开下拉菜单时@trashgod
    【解决方案2】:

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

    【讨论】:

    • 这就是我的想法。您如何防止选择“正在加载...”或启动另一个单独的线程?
    • 不要阻止选择“正在加载...”,什么也不做。如果选择后关闭组合,则加载数据时,“正在加载...”将替换为第一个选项或空白。特殊边框也会消失。您应该检查您没有加载数据以避免加载两次。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多