如何添加进度条?

时间:2012-01-18 19:25:36

标签: java swing user-interface progress-bar

我一直在努力了解如何添加进度条,我可以在我正在实现的GUI中创建一个进度条,但是即使在通过http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html检查后,我仍然不清楚我是怎么做的将方法设置为任务,以便我可以创建用于运行方法的进度条。请有人尝试向我解释这个问题,或者发布一个在GUI中使用的进度条示例,并将任务设置为方法。感谢。

4 个答案:

答案 0 :(得分:14)

也许我可以通过一些示例代码帮助您:

public class SwingProgressBarExample extends JPanel {

  JProgressBar pbar;

  static final int MY_MINIMUM = 0;

  static final int MY_MAXIMUM = 100;

  public SwingProgressBarExample() {
    // initialize Progress Bar
    pbar = new JProgressBar();
    pbar.setMinimum(MY_MINIMUM);
    pbar.setMaximum(MY_MAXIMUM);
    // add to JPanel
    add(pbar);
  }

  public void updateBar(int newValue) {
    pbar.setValue(newValue);
  }

  public static void main(String args[]) {

    final SwingProgressBarExample it = new SwingProgressBarExample();

    JFrame frame = new JFrame("Progress Bar Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(it);
    frame.pack();
    frame.setVisible(true);

    // run a loop to demonstrate raising
    for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) {
      final int percent = i;
      try {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            it.updateBar(percent);
          }
        });
        java.lang.Thread.sleep(100);
      } catch (InterruptedException e) {
        ;
      }
    }
  }
}

答案 1 :(得分:5)

你的问题有点模糊,但听起来我觉得你希望进度条显示特定运行方法的进度,我将其称为&#34; work()&#34;方法。遗憾的是,没有办法只将方法的引用传递给进度条 - 您的方法需要明确告诉进度条要显示的内容。这就是我要做的事情:

  1. 使进度条的引用可用于work() - 将其作为参数传递给work(),或者提供一个访问器方法,使您的work()中的代码可以调用以获取参考进度条。

  2. 内部工作(),在您获得对进度条的引用后(我将调用&#34; pb&#34;,调用pb.setMinimum(0)和pb .setMaximum(n)其中n是您的方法必须通过的步数。

  3. 当您的方法完成每个步骤时,请调用pb.setValue(pb.getValue()+ 1);

  4. 在方法结束时,调用pb.setValue(0);在返回之前重置进度条。

  5. 此外,如果您希望进度条显示String消息,则首先必须调用pb.setStringPainted(true),然后对进度条显示后续对pb.setString(string)的调用。

答案 2 :(得分:2)

请参阅my answer on another SO question,其中包含使用JProgressBar进行更新的SwingWorker示例。 SwingWorker用于在后台执行长时间运行的任务(如果是示例,则只是常规Thread.sleep)并以特定间隔报告进度。

我还强烈建议您查看Swing concurrency tutorial以获取有关在执行干扰用户界面的长时间运行任务时应使用SwingWorker的原因的更多背景信息。

Swing tutorial about JProgressBars提供了与我发布的相似的示例,值得一看

答案 3 :(得分:0)

这个怎么样,

  1. JFrame-> JButton(BorderLayout.NORTH)

  2. JFrame-> JPanel-> JProgressBar(BorderLayout.SOUTH)

  3. 您可以在任意位置添加按钮部分,例如Progress progress = ...; state=true; progress.waitFor(); state=false;

    private static void daa() {
        //Frame
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(frame.getWidth() + 55, frame.getHeight() + 55);
    
        //Button
        JButton jButton = new JButton("State");
        frame.add(jButton, BorderLayout.NORTH);
    
        //Progress Bar
        JProgressBar progressBar = new JProgressBar();
        progressBar.setIndeterminate(true);
    
        //Text for progress bar
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(progressBar);
        panel.add(new JLabel("Please wait......."), BorderLayout.PAGE_START);
    
        //linking
        panel.add(progressBar);
        frame.add(panel, BorderLayout.SOUTH);
    
        boolean[] state = {false};
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                state[0] = !state[0];
                state();
            }
    
            private void state() {
                if (state[0] == true) {
                    panel.hide();
                } else {
                    panel.show();
                }
    
            }
        });
    }