Java 如何添加进度条?

Java 如何添加进度条?,java,swing,user-interface,progress-bar,Java,Swing,User Interface,Progress Bar,我一直在试图理解如何添加进度条,我可以在我正在实现的GUI中创建一个进度条并使其显示出来,但即使在检查之后,我仍然不清楚如何将方法设置为任务,以便创建一个用于运行方法的进度条。请有人给我解释一下,或者发布一个在GUI中使用进度条并将任务设置为方法的示例。谢谢。您的问题有点模糊,但我觉得您希望进度条显示特定运行方法的进度,我称之为“work()”方法。不幸的是,无法将对方法的引用传递给进度条-方法需要显式地告诉进度条要显示什么。下面是我要做的: 使进度条的引用对work()可用-将其作为参数传递给

我一直在试图理解如何添加进度条,我可以在我正在实现的GUI中创建一个进度条并使其显示出来,但即使在检查之后,我仍然不清楚如何将方法设置为任务,以便创建一个用于运行方法的进度条。请有人给我解释一下,或者发布一个在GUI中使用进度条并将任务设置为方法的示例。谢谢。

您的问题有点模糊,但我觉得您希望进度条显示特定运行方法的进度,我称之为“work()”方法。不幸的是,无法将对方法的引用传递给进度条-方法需要显式地告诉进度条要显示什么。下面是我要做的:

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

  • 在work()内部,在获得对进度条(我将称之为“pb”)的引用后,调用pb.setMinimum(0)和pb.setMaximum(n),其中n是方法必须完成的步骤数

  • 当方法完成每个步骤时,调用pb.setValue(pb.getValue()+1)

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

  • 此外,如果希望进度条显示字符串消息,则首先必须调用pb.setstringpaint(true),然后再调用pb.setString(String)将显示在进度条上。

    请参阅其中包含的
    JProgressBar
    示例,该示例通过使用
    SwingWorker
    进行更新。
    SwingWorker
    用于在后台执行长时间运行的任务(在本示例中,它只是一个常规
    线程。睡眠
    )并定期报告进展情况

    我还强烈建议您查看一下,以获取更多背景信息,了解在执行干扰UI的长时间运行任务时为什么要使用
    SwingWorker


    中有一个与我发布的示例类似的示例,也值得一看

    也许我可以帮助您了解一些示例代码:

    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) {
            ;
          }
        }
      }
    }
    
    公共类SwingProgressBarExample扩展了JPanel{
    JProgressBar-pbar;
    静态最终int MY_最小值=0;
    静态最终int MY_最大值=100;
    公共SwingProgressBarExample(){
    //初始化进度条
    pbar=新的JProgressBar();
    pbar.setMinimum(MY_最小值);
    pbar.setMaximum(我的最大值);
    //添加到JPanel
    添加(pbar);
    }
    公共void updateBar(int newValue){
    pbar.设定值(新值);
    }
    公共静态void main(字符串参数[]){
    最终SwingProgressBarExample it=新SwingProgressBarExample();
    JFrame=新JFrame(“进度条示例”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(it);
    frame.pack();
    frame.setVisible(true);
    //运行一个循环来演示提升
    对于(inti=MY_MINIMUM;i

  • JFrame->JButton(BorderLayout.NORTH)

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

  • 您可以随时添加按钮部分,例如当
    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();
                }
    
            }
        });
    }
    

  • 这个可能的副本中的一个答案可能会有所帮助。我不明白。为什么要创建一个进度条来运行方法(如您所说)?进度条的目的是向用户提供有关正在运行的任务的信息。因此,oracle文档中的任务指的是将管理进度条的线程。因此,使用swing worker(如链接中所述)创建进度条,然后在(长?)任务中更新进度条。
    doInBackground()
    SwingWorker的方法用于管理进度条。我建议您再次查看您的oracle tuto,说明非常清楚,示例可重复使用。祝您好运!