【发布时间】:2014-06-03 17:48:55
【问题描述】:
我是 java swing 新手,我想阅读文本文件。在读取该文件时,我想在 java 进度条中显示已读取行的百分比。欢迎任何示例代码。我试过了,但我不知道我的逻辑是否正确。我怎样才能做到这一点。
import java.io.*;
import javax.swing.*;
import javax.swing.UIManager.*;
import javax.swing.border.EtchedBorder;
public class UploadFile
{
JFrame frame;
JProgressBar progressBar_1;
public static void main(String args[])throws IOException
{
UploadFile obj=new UploadFile();
obj.redfile();
}
public UploadFile()
{
frame = new JFrame();
frame.setBounds(100, 100, 400, 200);
frame.getContentPane().setLayout(null);
progressBar_1 = new JProgressBar();
progressBar_1.setBounds(102, 40, 150, 16);
frame.getContentPane().add(progressBar_1);
progressBar_1.setStringPainted(true);
frame.setVisible(true);
}
public void redfile()
{
try{
String s="";
File f1=new File("sample.txt");
FileReader fr=new FileReader(f1);
BufferedReader br=new BufferedReader(fr);
Task t=new Task();
t.start();
while((s=br.readLine())!=null){
try{Thread.sleep(200);}catch(Exception e){
}
System.out.println("-->"+s);
}
}catch(Exception e){
}
}
private class Task extends Thread
{
public void run()
{
for(int j=0;j<=100; j+=5)
{
progressBar_1.setValue(j);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}
}
【问题讨论】:
-
嗯,不应该在任务中完成文件的读取和进度棒的更新在 EDT 的上下文中完成吗?尝试查找 SwingWorker...
-
使用
SwingWorker。您的代码破坏了 Swing 的线程模型并且过于复杂。此外,您没有关闭您的Reader,所以这是内存泄漏。最后,您实际上并没有在阅读文件时更新进度条 - 无论文件大小如何,您只需每 100 毫秒更新一次。 -
考虑为此使用 ProgressMonitorInputStream。
-
+1 对@qqilihq 对
ProgressMonitorInputStream和progress monitors 的建议。我还建议查看JTextComponent.read(Reader,Object)。 -
@BoristheSpider 感谢这个想法。
标签: java multithreading swing io jprogressbar