首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实时查看ProgressMonitor进度?

如何实时查看ProgressMonitor进度?
EN

Stack Overflow用户
提问于 2019-09-20 07:47:51
回答 1查看 300关注 0票数 0
代码语言:javascript
复制
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    int jTableRows = jTable1.getRowCount();
    ProgressMonitor progressMonitor;
    progressMonitor = new ProgressMonitor(ImportDataFromExcel.this, "Running a Long Task", "", 0, jTableRows);
    for (int i = 0; i < jTableRows; i++) {
        String message = String.format("Completed %d.\n", i);
        progressMonitor.setNote(message);
        progressMonitor.setProgress(i);
    }
}

当我点击一个按钮在数据库中插入数据时,我希望得到ProgressMonitor进度,但只有在整个过程完成时才能得到进度结果。如何实时查看进度?

EN

回答 1

Stack Overflow用户

发布于 2019-09-20 08:28:23

Swing中的所有繁重任务都应该由SwingWorkers执行。否则,大任务将给Event Dispatch Thread带来困难,因此事件无法发生(图形用户界面将冻结)。

因此,您必须创建一个SwingWorker并以百分比计算任务的完成步数,并将该值提供给进度条。但是,您必须记住,因为progressbar.setValue(int value)是组件更新,所以它应该只发生在EDT内部。这就是为什么你必须使用worker的publishprocess方法。

让我们看一个例子,我们必须在Desktop中写1000行到一个文本文件中,然后看看它的进度。这是一个“大任务”(我让线程休眠),所以它符合我们的情况。

代码语言:javascript
复制
public class ProgressExample extends JFrame {
    private static final long serialVersionUID = 5326278833296436018L;

    public ProgressExample() {
        super("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(new ProgressPanel());

        pack();
        setLocationRelativeTo(null);

    }

    private static class WriteTextWorker extends SwingWorker<Void, Integer> {
        private ProgressableView view;

        public WriteTextWorker(ProgressableView view) {
            this.view = view;
        }

        @Override
        protected void process(List<Integer> chunks) {
            int progress = chunks.get(0);
            view.setProgress(progress);
        }

        @Override
        protected Void doInBackground() throws Exception {
            publish(0);
            File desktop = new File(System.getProperty("user.home"), "Desktop");
            File textFile = new File(desktop, "stackoverflow.txt");
            int linesToWrite = 1000;
            try (FileWriter fw = new FileWriter(textFile, true);
                    BufferedWriter bw = new BufferedWriter(fw);
                    PrintWriter out = new PrintWriter(bw)) {
                for (int i = 0; i < linesToWrite; i++) {
                    out.println("This is line: " + i);
                    out.flush();
                    //Calculate percentage of completed task
                    int percentage = ((i * 100) / linesToWrite);
                    System.out.println("Percentage: " + percentage);
                    publish(percentage);
                    Thread.sleep(10); //Heavy task
                }
            }
            return null;
        }

    }

    private static class ProgressPanel extends JPanel implements ProgressableView {
        private JProgressBar progressBar;
        private SwingWorker<Void, Integer> worker;

        public ProgressPanel() {
            super(new BorderLayout());
            progressBar = new JProgressBar();
            add(progressBar, BorderLayout.PAGE_START);

            JButton writeLinesButton = new JButton("Press me to do a long task");
            writeLinesButton.addActionListener(e -> worker.execute());
            add(writeLinesButton, BorderLayout.PAGE_END);

            worker = new WriteTextWorker(this);
        }

        @Override
        public int getProgress() {
            return progressBar.getValue();
        }

        @Override
        public void setProgress(int progress) {
            progressBar.setValue(progress);
        }

    }

    public static interface ProgressableView {
        int getProgress();

        void setProgress(int progress);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ProgressExample().setVisible(true));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58020090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档