如何表明JComboBox正在加载值?

时间:2011-12-26 15:08:40

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

我有一个JComboBox,其值通过网络检索。

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

基本要求包括:

  1. JComboBox的下拉菜单不应该锁定EDT,但是在有值之前,组合的动作不应该起作用。
  2. 用户应该知道何时检索了所有数据。
  3. 指示的大小(UI不动产)应尽可能小。
  4. 请注意,在用户想要查看组合的值(即展开下拉列表)之前,不会检索数据。

    我使用的解决方案:

    我使用SwingWorker来保持用户界面的响应能力。使用JIDE的Overlayable和JIDE的InfiniteProgressPanel覆盖组合框,该{J}的{{1}}会监听工作人员。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

不强迫我的用户等到数据加载,将鳗鱼和斯坦的答案结合起来: - )

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