进度条与函数同时运行(在另一个类中)

时间:2012-04-01 06:38:46

标签: java swing user-interface netbeans

我创建了一个表单,其中有两个组件,按钮和进度条(Netbeans拖放).Form包含我的应用程序启动的主要方法。我已经创建了另一个类,其中我编写了一个函数。我想要的是,当我按下一个按钮时,应用程序进入该功能,进度条与其同时运行,当该功能完成其功能时,进度条显示100%完成。现在该功能可以随时使用完成所以我无法设置进度条的最大值。那么,在这种情况下该怎么办?任何人都可以给我一个很好的例子。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

由于你在所谓的“被调用函数”中正在做什么样的工作,所以很难说,你想要在场景中想要什么,尽管你可以像progressBar.setValue(someProgress);那样定期使用你的行。它是Indeterminate Statetrue,在功能结束时你可以简单地说progressBar.setValue(100);Indeterminate State会转到false这里,以便它可以向最终用户显示。

看看这个示例程序:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ProgressExample
{
    public static JProgressBar progressBar;

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("Progress Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);                

        JButton button = new JButton("START");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                progressBar.setIndeterminate(true);
                WorkingDialog wd = new WorkingDialog();
                wd.createAndDisplayDialog();
            }
        });

        contentPane.add(progressBar, BorderLayout.PAGE_START);
        contentPane.add(button, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }   

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ProgressExample().createAndDisplayGUI();
            }
        });
    }
}

class WorkingDialog extends JDialog
{
    private String message = "HelloWorld";
    private int count = 0;
    private JTextField tfield;
    private Timer timer;

    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            if (count == 10)
            {
                timer.stop();
                ProgressExample.progressBar.setIndeterminate(false);
                ProgressExample.progressBar.setValue(100);
                ProgressExample.progressBar.setStringPainted(true);
                dispose();
                return;
            }
            tfield.setText(tfield.getText() + message.charAt(count));
            count++;
        }
    };

    public void createAndDisplayDialog()
    {
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel panel = new JPanel();
        tfield = new JTextField(10);

        panel.add(tfield);

        add(panel);
        pack();
        setVisible(true);

        timer = new Timer(1000, timerAction);
        timer.start();
    }
}

所以,好像你写的是

ProgressExample.progressBar.setIndeterminate(false);
ProgressExample.progressBar.setValue(100);
ProgressExample.progressBar.setStringPainted(true);
while循环后

答案 2 :(得分:1)

您可以查看my answer in a previous SO question,其中包含使用JProgressBar的示例,该示例使用Thread从其他SwingWorker获取更新。是否使用SwingWorker取决于您的使用案例。如果该函数需要一些时间来运行,则最好使用SwingWorker以避免阻止UI。