如何更新进度条以显示活动期间(方法工作时)的进度?

时间:2014-10-27 20:23:30

标签: java swing progress-bar

我搜索了这个问题,但我找到了几个文档,但它们太复杂了,无法理解。

我只想简单地让一个活动期间的进度条不起作用。

在我提供的示例代码中,进度条在运行方法完成后工作,而不是在此期间。当run方法工作时,如何更改此代码以更新进度条?

我想我必须创建一个新的线程来处理长期运行的方法,但我不知道该怎么做?

public class Gui extends JFrame {

private JProgressBar progressBar;
private JButton button;

public Gui() throws HeadlessException {
    super("Progress bar");
    setSize(500, 100);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
    add(resPan());
}

private JPanel resPan() {
    JPanel resPan = new JPanel(new FlowLayout(FlowLayout.CENTER));
    resPan.setPreferredSize(new Dimension(500, 100));

    progressBar = new JProgressBar();
    progressBar.setPreferredSize(new Dimension(180, 40));

    button = new JButton("Action");
    button.setPreferredSize(new Dimension(80, 40));
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            progressBar.setIndeterminate(true);
            run();
        }

    });

    resPan.add(button);
    resPan.add(progressBar);
    return resPan;
}

private void run() {
    try {
        Thread.sleep(4000);
        //progressBar.setIndeterminate(false);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}}

2 个答案:

答案 0 :(得分:2)

是的,您必须创建一个新线程。否则,Swing无法显示任何新内容(例如更新进度条),因为Swing的线程仍然忙于您的run方法。 一个简单的方法是:

public void actionPerformed(ActionEvent arg0) {
     progressBar.setIndeterminate(true);
     new Thread(new Runnable() {
         @Override
         public void run() {
             // do the long-running work here
             // at the end:
             SwingUtilities.invokeLater(new Runnable() {
                 @Override
                 public void run() {
                     progressBar.setIndeterminate(false);
                 }
             );
         }
     ).start();
}

请注意,progressBar必须声明为final才能在线程的runnable中使用。

答案 1 :(得分:1)

在SwingWorker java中,您可以找到这个确切的示例。 在Swingworker中运行的线程,正在使用SwingWorker#setProgress(int progress)

更新进度

http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html