java - 创建进度条以使用 java 中 for 循环的结果进行更新

标签 java swing for-loop jprogressbar

我创建了一个从 0 到 850000 的 for 循环。我选择了一个较大的数字,因为我想创建一个进度条,该进度条将使用 for 循环中的结果进行更新。这是我到目前为止的代码。

public class ProgressBarTest extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {





        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ProgressBarTest frame = new ProgressBarTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ProgressBarTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        for(int i = 850000; i>0; i--) {
            System.out.println("i = " + i);
        }

    }

}

我似乎无法找到一种方法来使用 for 循环获取进度条来更新。我确实创建了一个适用于计时器的进度条,但这不是我想要的。我基本上希望它从 0% 更新到 100%。这对我来说似乎很简单,但我已经坚持了一段时间了。我很欣赏任何类型的示例代码,它们可以帮助我理解它是如何工作的。

最佳答案

这是完整的示例,使用 Saran 提出的 SwingWorker

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;

public class ProgressBarTest extends JFrame {

    private static final long LOOP_LENGTH = 85000000;

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    ProgressBarTest frame = new ProgressBarTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ProgressBarTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        JProgressBar progress = new JProgressBar();
        progress.setStringPainted(true);
        contentPane.add(new JLabel("Loop progress is: "), BorderLayout.NORTH);
        contentPane.add(progress, BorderLayout.SOUTH);
        setContentPane(contentPane);
        ProgressWorker worker = new ProgressWorker(progress);
        worker.execute();
    }

    private static class ProgressWorker extends SwingWorker<Void, Integer> {
        private final JProgressBar progress;

        public ProgressWorker(JProgressBar progress) {
            this.progress = progress;
        }

        @Override
        protected Void doInBackground() throws Exception {
            for (long i = LOOP_LENGTH; i > 0; i--) {
                final int progr = (int) ((100L * (LOOP_LENGTH - i)) / LOOP_LENGTH);
                publish(progr);
            }
            return null;
        }

        @Override
        protected void process(List<Integer> chunks) {
            progress.setValue(chunks.get(chunks.size() - 1));
            super.process(chunks);
        }

        @Override
        protected void done() {
            progress.setValue(100);
        }
    }
}

关于java - 创建进度条以使用 java 中 for 循环的结果进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393846/

相关文章:

java - 访问集合中键在特定范围内的项目

java - 现代 Swing 部署和 JVM 约会

c++ - 我做错了什么导致无限循环

python - 使用 Beautiful Soup 在 Python 中递归地抓取网站的所有子链接

c - 将 char 数组中的值传递给 c 中的 BoS 函数

java - 使用 Java 中的 twitter api 将超过 140 个字符的链接发布到 twitter

java - 通用堆栈构造函数的 Big-O

java - 为什么 Maven 包含相同依赖项的多个版本?

java - 如何自动调整 JTree 对象的大小?

java - 使用 GlassPane 的 Java 内部透明选择窗口