1

我正在尝试创建一个弹出对话框进度条,最好是 Indeterminate 但这并不是太重要。我一直在浏览“Oracle 的 ProgressBar 教程”和 Google 搜索,但没有那么幸运地让它工作。我将我的代码粘贴到我的动作侦听器下面,并且不会弹出对话框。有什么建议么?提前致谢!

对不起,这是我在这个网站上的第一篇文章。但它的工作原理是,当我按下创建按钮时,它会从不同的服务器和目录中获取一些信息并为我创建一个文件。这就是新项目的内容。JTextBox功能是我创建的一个枚举,它使用创建按钮时的文本进行设置。问题是这个过程需要时间来处理,所以我想要一个进度条来显示它的处理

private class CreateButton implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent arg0) { 
        class Task extends SwingWorker<Void, Void>
        {
            @Override
            protected Void doInBackground()
            {                   
                //Set Variables
                for(Feature f : Feature.values())
                {
                    if(f.getComp() != null)
                    {
                        f.getVariable().setVariable(((JTextField) f.getComp()).getText());
                    }
                }

                new Project(jobs.getSelectedValue().split("-")[0].trim(), 
                            jobs.getSelectedValue().split("-")[1].trim(),
                            features);
                return null;
            }
        }

        ProgressMonitor pm = new ProgressMonitor(display, "Testing...", "", 0, 100);
        pm.setProgress(0);
        Task task = new Task();
        task.execute();
    }

}   
4

3 回答 3

1

我不确定您的SSCCE,所以我只是发布JProgressBar通常的工作方式。

了解SwingWorkerJProgressBar

在后台进程显示进度条。显示了它如何工作的简单示例。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class MyProgressBarTest {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MyProgressBarTest obj = new MyProgressBarTest();
            obj.createGUI();
        }
    });
    }

    public void createGUI() {
        final JFrame frame = new JFrame();

        JPanel panel = new JPanel();
        final JButton button = new JButton("Progress");

        progressBar = new JProgressBar();

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar, frame);
                progressBarObj.createProgressUI();

                MyActionPerformer actionObj = new MyActionPerformer(progressBar, progressBarObj, button);
                actionObj.execute();

            }
        });

        panel.add(button);
        frame.add(panel);

        frame.setTitle("JProgressBar Example");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocationRelativeTo(null);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }
}

class MyActionPerformer extends SwingWorker<String, Object> {

    JProgressBar fProgressBar;
    MyCustomProgressBarDialog progressDialog;
    JButton button;

    public MyActionPerformer(JProgressBar progressBar, MyCustomProgressBarDialog progressDialog, JButton button) {
        this.fProgressBar = progressBar;
        this.fProgressBar.setVisible(true);
        this.fProgressBar.setIndeterminate(true);
        this.button = button;
        this.progressDialog = progressDialog;

        this.button.setEnabled(false);
    }

    protected String doInBackground() throws Exception {

        calculateResult();
        return "Finished";
    }

    protected void done() {
        fProgressBar.setVisible(false);
        this.progressDialog.setVisible(false);
        this.button.setEnabled(true);
    }

    public void calculateResult() {
        for (int i = 0; i < 500000; i++) {
            System.out.println("Progress Bar: " + i);
        }
    }
}

class MyCustomProgressBarDialog extends JDialog {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;
    private JFrame motherFrame;
    private JLabel label = new JLabel("loading.. ");
    private JButton button;

    public MyCustomProgressBarDialog(JProgressBar progressBar, JFrame frame) {

        this.progressBar = progressBar;
        this.motherFrame = frame;
        this.button = button;
    }

    public void createProgressUI() {
        add(label, BorderLayout.NORTH);
        add(progressBar, BorderLayout.CENTER);
        setSize(50, 40);
        setAlwaysOnTop(true);
        setLocationRelativeTo(motherFrame);
        setUndecorated(true);
        setVisible(true);
    }
}
于 2013-02-07T17:32:16.820 回答
0

这来自 ProgressMonitor 的 Oracle javadoc:

最初,没有 ProgressDialog。在第一个 millisToDecideToPopup 毫秒(默认为 500)之后,进度监视器将预测操作需要多长时间。如果它长于 millisToPopup(默认 2000,2 秒),则会弹出 ProgressDialog。

请注意,它不会在您创建后至少 1/2 秒后弹出。即使这样,它也只会在进程预计需要超过 2 秒时才会弹出。

这一切都基于您重复调用setProgress(int)以及在您给定的范围内值的进展之间的时间。

我怀疑导致对话框弹出的条件没有得到满足。或者,也许您的程序在这段时间过去之前就退出了。

于 2013-02-07T17:12:06.000 回答
0

您需要定义属性

ProgressMonitor pm;

然后应该创建总进度大小

int totalProgress = Feature.values().size();

然后在循环中只是增加计数

int counter = 0;
for(Feature f : Feature.values())
{
  if (pm.isCanceled()) {
    pm.close();
    return null;
  }
  pm.setProgress(counter);
  pm.setNote("Task is " + counter*100/totalProgress + "% completed");
  counter++;

调用进度监视器

pm = new ProgressMonitor(display, "Testing...", "", 0, totalProgress);

假设大部分工作是在循环中完成的,如果其他部分(例如项目创建)需要时间,那么您可以totalProgress在功能完成后添加额外的百分比计数或重置监视器。

于 2013-02-07T17:30:49.020 回答