【发布时间】:2014-01-11 17:42:22
【问题描述】:
我正在使用套接字通过网络发送文件。文件被正确接收,没有任何问题。但现在我使用JProgressBar 来显示已发送文件的百分比。我的问题是,即使我在单独的线程中更新 GUI,进度条也只有在文件完全发送时才会更新。我也尝试将主线程的优先级调整为Thread.MIN_PRIORITY,但问题仍然存在。
完整的代码很长,所以我不发布它(如果有人问我会发布)。发送文件和更新进度条的短代码是
final double temp=(done/fileSize)*100; // percentage of file sent
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
jpb.setString("Completed : "+temp+" %");
jpb.setValue((int)temp); // this is executed only when 100%
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
System.out.println(temp); // only this and
bos.write(b,0,read); // this statement is executed
【问题讨论】:
-
不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用
Thread.sleep(n)实现一个SwingTimer用于重复任务或一个SwingWorker用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 -
你读过Oracle官方教程-如何使用ProgressBar
-
ProgressBar如果您的意思是JProgressBar,请输入。如果您不这样做,请链接到它。 -
在你的代码中,在你浏览完链接的文章之后。
-
SwingWorker 旨在在后台线程中执行耗时的任务(数据库调用、下载/上传文件、大量处理内容)并在Event Dispatch Thread 中更新 Swing 组件(例如 JProgressBar)。所以在这种情况下是要走的路。查看示例 here。
标签: java multithreading swing event-dispatch-thread jprogressbar