从另一个类设置Progressbar

时间:2016-04-06 13:57:19

标签: java swing progress-bar

我正在尝试从另一个类设置我的进度条但是失败了。这是我的进度栏Upload

JProgressBar progressBar = new JProgressBar();
progressBar.setBounds(91, 134, 284, 17);
frame.getContentPane().add(progressBar);

我有另一个名为Read的班级。在这个类中,我有一个需要读取文件的循环,所以我想用该类的迭代器i设置进​​度。我知道我必须像这样设置最小值和最大值:

progressBar.setMinimum(0);
progressBar.setMaximum(numRows);

对于价值:

progressBar.setValue(newValue);

如何设置进度条的值,以便不断更新i的值?

2 个答案:

答案 0 :(得分:0)

首先,您的Reader类必须具有对相关组件(JProgressBar)的引用。我知道这已经解决了。

之后,为了阅读文件,我强烈建议使用扩展javax.swing.SwingWorker的类。该模式允许您在后台工作(可能用于重读操作,如读取大文件)而不影响AWT线程,因此您的GUI不会受到影响。因此,您的读者应该扩展javax.swing.SwingWorker

作为简短的简历,它提供了一个名为doInBackground的方法,您应该在其中实现“重”操作以及一个名为process的方法,在该方法中接收数据块并添加您自己的计算为了进步。

process方法在AWT中执行,因此您可以使用此方法更新任何UI组件(这样可以更新进度条)

请参阅此link以获取更多信息。

答案 1 :(得分:0)

您应该按照JProgressBar documentation

中的说明使用SwingWorker

SwingWorker是我们可以添加propertyChangeListener

的主题

之后我们可以调用firePropertyChange来调用监听器。在监听器中,我们可以通过调用setValue()来更新进度条。

以下是阅读文件和更新进度条的工作示例。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

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

public class ProgressBar {

    private static final String PROGRESS_PROPERTY_NAME = "progress";
    final static String fileName = "My_file_location";

    public static void main(String[] args) {
        JFrame frame = new JFrame("Progress bar");
        JPanel panel = new JPanel();

        final JProgressBar progressBar = new JProgressBar();
        progressBar.setMinimum(0);
        progressBar.setMaximum(100);
        progressBar.setStringPainted(true);

        panel.add(progressBar);


        JButton button = new JButton("Start reading");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ReadFiletask task = new ReadFiletask(fileName);
                 task.addPropertyChangeListener(
                 new PropertyChangeListener() {
                     public  void propertyChange(PropertyChangeEvent evt) {

                         if (PROGRESS_PROPERTY_NAME.equals(evt.getPropertyName())) {
                             progressBar.setValue((Integer)evt.getNewValue());
                         }
                     }
                 });

                 task.execute();
            }
        });
        panel.add(button);

        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    public static class ReadFiletask extends SwingWorker<Boolean, Integer> {
        String fileName;
        public ReadFiletask (String fileName) {
            this.fileName = fileName;
        }

        @Override
        protected Boolean doInBackground() throws Exception {
            System.out.println("Started reading");
            byte[] buffer = new byte[1024 * 1024];//1mb
            InputStream is = null;
            try {
                Path file = Paths.get(fileName);
                long fileSize = Files.size(file);
                is = Files.newInputStream(file, StandardOpenOption.READ);
                int readLen = -1;
                int readCounter = 0;
                while((readLen = is.read(buffer)) != -1) {
                    readCounter += readLen;

                    int percentDone = (int)( (readCounter * 100.0) / fileSize);
                    System.out.println("done : " + percentDone);

                    /*Most important part is here */

                    firePropertyChange(PROGRESS_PROPERTY_NAME, 0, percentDone);
                }

            } catch (IOException e1) {
                e1.printStackTrace();
            } finally {
                if(is != null) {
                    try {
                        is.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
            System.out.println("Finished");
            return true;
        }

    }
}