如何显示处理结束时自动关闭的“正在加载...”消息(类似于进度条)?

时间:2011-05-19 09:26:35

标签: java swing jframe jlabel actionlistener

我有一个comboBox jComboBox1,其中包含世界上所有国家/地区的名称...在选择其中一个国家/地区后,第二个组合框jComboBox2将填充jComboBox1中所选国家/地区的所有州。现在,我希望在填充所选国家/地区的状态时显示进度条或“正在加载...”消息,并在完成后自动关闭。

代码就是这样......

 public void actionPerformed(ActionEvent e){
    if(e.getSource()==jComboBox1){
            if(jCombobox1.setSelectedIndex()!=-1){
                   Country country=new Country();
                   country.populateStates(jComboBox2,label,this);
                  //"label" is of type JLabel whose text is is set to show the progress
                  //"this" refers to the current frame to repaint once label is changed
            }
    }
 }

我以为我可以在框架中使用JLabel,其可见性和文本可以使用setVisible()和setText设置。请注意,“Country”是一个不同的类,我将此标签传递给其方法populateStates,其中我使用label.setText(“加载状态的详细信息:”+ state)并执行frame.repaint()。 (这就是我传递框架对象“this”的原因)。即使这样,标签也不会改变。

但是,选择国家/地区后,标签初始文本中出现的唯一更改是一旦国家/地区的选择结束,就会将其设置为最后一个文本。标签中的中间更改不会出现在GUI中。为什么会发生这种情况?我的方法有什么问题?我是否必须使用其他方法使用线程???如果是这样,怎么??

2 个答案:

答案 0 :(得分:3)

首先,由于这似乎是一项长期任务,您需要填写国家/地区状态列表 OUTSIDE EDT。

为此,您可以使用SwingWorkerSwingWorker提供了一些可用于向用户提供反馈的方法。

但是你需要做一些工作才能显示反馈。

答案 1 :(得分:2)

  

我必须使用get()来检索值,但get()会停止所有GUI更新。

是的,“在事件调度线程上调用get()会阻止所有事件(包括重绘)被处理,直到SwingWorker完成。”相反,publish()会在EDT上累积并process()结果。请参阅示例herehere

附录:get() API显示了在此上下文中使用模态对话框的示例。您的PropertyChangeListener可以在对话框中更新JProgressBar