How to add a progress bar?

前端 未结 4 1793
误落风尘
误落风尘 2020-12-15 12:22

I have been trying to understand how to add a progress bar, I can create one within the GUI I am implementing and get it to appear but even after checking through http://doc

相关标签:
4条回答
  • 2020-12-15 12:58

    Your question is a bit vague, but it sounds to me like you want the progress bar to show progress for a specific running method, which I'll call the "work()" method. Unfortunately, there's no way to just pass a reference to your method to a progress bar - your method needs to explicitly tell the progress bar what to display. Here's what I would do:

    1. Make the progress bar's reference available to work() - either pass it in as an argument to work(), or provide an accessor method that your code in work() can call to get a reference to the progress bar.

    2. Inside work(), after you've obtained a reference to the progress bar (which I'll call "pb", call pb.setMinimum(0) and pb.setMaximum(n) where n is the number of steps your method has to get through.

    3. As your method completes each step, call pb.setValue(pb.getValue()+1);

    4. At the end of your method, call pb.setValue(0); to reset the progress bar prior to returning.

    Also, if you want your progress bar to display a String message, you first have to call pb.setStringPainted(true), then subsequent calls to pb.setString(string) will show up on the progress bar.

    0 讨论(0)
  • 2020-12-15 13:10

    Maybe I can help you with some example code:

    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) {
            ;
          }
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-15 13:15

    See my answer on another SO question which includes an example of a JProgressBar which gets updated by using a SwingWorker. The SwingWorker is used to execute a long running task in the background (in case of the example it is just a regular Thread.sleep) and report on progress at certain intervals.

    I would also strongly suggest to take a look at the Swing concurrency tutorial for more background info on why you should use a SwingWorker when performing long-running tasks which interfere with the UI.

    A similar example as the one I posted is available in the Swing tutorial about JProgressBars, which it also worth looking at

    0 讨论(0)
  • 2020-12-15 13:17

    How about this,

    1. JFrame->JButton (BorderLayout.NORTH)

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

    3. You can add button part where ever you like, for example when 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();
                  }
      
              }
          });
      }
      
    0 讨论(0)
提交回复
热议问题