JProgressBar在数据加载时摆动

时间:2012-11-13 18:48:15

标签: java swing swingworker jprogressbar

我有来自UI的服务器调用。它的响应时间有点高。所以我想在从服务器加载数据时显示进度条。我使用此approach尝试了以下代码来显示进度条。我在做错的地方当我在按钮点击时调用calculateResult()方法时,我没有看到进度条。我无需在进度条上显示任何百分比。它只需要显示数据正在加载。

//我试过以下代码。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

 public class MyProgressBarTest extends JFrame {
private static final long serialVersionUID = 1L;

private static JProgressBar progressBar;

public static void main(String[] args) {
    MyProgressBarTest obj = new MyProgressBarTest();
    obj.createGUI();
}

public void createGUI() {
    JPanel panel = new JPanel();
    JButton button = new JButton("Progress");

    progressBar = new JProgressBar();

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {

            MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
            progressBarObj.createProgressUI();

            MyActionPerformer actionObj = new MyActionPerformer(progressBar);
            actionObj.execute();

            progressBarObj.setVisible(false);
        }
    });

//      panel.add(progressBar);
    panel.add(button);
    add(panel);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setLocationRelativeTo(null);
//      pack();
    setSize(200, 300);
    setVisible(true);
}
}

class MyActionPerformer extends SwingWorker<String, Object> {

JProgressBar fProgressBar;

public MyActionPerformer(JProgressBar progressBar) {
    this.fProgressBar = progressBar;
    this.fProgressBar.setVisible(true);
    this.fProgressBar.setIndeterminate(true);
}

protected String doInBackground() throws Exception {

    calculateResult();
    return "Finished";
}

protected void done() {
    fProgressBar.setVisible(false);
}

public void calculateResult() {
    for (int i = 0; i < 500000; i++) {
        System.out.println("Progress Bar: " + i);
    }
}
}

class MyCustomProgressBarDialog extends JDialog {
private static JProgressBar progressBar;

public MyCustomProgressBarDialog(JProgressBar progressBar) {
    this.progressBar = progressBar;
}

public void createProgressUI() {
    add(progressBar);
    setLocationRelativeTo(null);
    setSize(50, 20);
    setVisible(true);
}
}

3 个答案:

答案 0 :(得分:5)

您的进度条立即消失的原因是ActionListener

button.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
   MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
   progressBarObj.createProgressUI();

   MyActionPerformer actionObj = new MyActionPerformer(progressBar);
   actionObj.execute();

   progressBarObj.setVisible(false);
  }
});

actionObj.execute();方法没有阻止(好东西或者它没用),这意味着在你通过该调用启动SwingWorker之后,你将立即执行progressBarObj.setVisible(false);语句。

这会导致进度条对话框消失。

我可以想到2个解决方案

  • 将对话框传递到SwingWorker,然后使用setVisible( false )
  • done方法在对话框中致电SwingWorker
  • SwingWorker会触发PropertyChangeEvent,以便您确定进度。您可以使用此类侦听器在计算完成时隐藏对话框

答案 1 :(得分:1)

您无法看到进度条,因为您没有将其添加到面板

简单:

panel.add(PROGRESS_BAR);
panel.add(button);

会做到这一点。

我希望它有所帮助。干杯

答案 2 :(得分:1)

JProgressBarComponent。必须将其添加到Container才能显示。你没有在任何地方添加你的。