我正在尝试从另一个类设置我的进度条但是失败了。这是我的进度栏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
的值?
答案 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;
}
}
}