我正在使用套接字通过网络发送文件。正确接收文件没有任何问题。但现在我使用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
答案 0 :(得分:0)
问题出在下面一行:
final double temp=(done/fileSize)*100; // percentage of file sent
如果完成且 fileSize 都不是 double ,那么 done / fileSize 的结果为0.0。
将它们加倍(至少其中一个)以保留除法的小数部分。
答案 1 :(得分:0)
这是我谈到的实现。
这不是最好的设计,因为我快速而又脏,但这样文件传输代码不依赖于UI。
public class FileTransfer implements Runnable
{
double transferPercent = 0.0;
double getTransferPercent(){ return transferPercent; }
@Override
public void run()
{
while(transferingFile)
{
// Write data
// Update transferPercent
}
}
}
public class UIClass extends TimerTask
{
private FileTransfer fileTransfer;
public void createUI()
{
TimerTask myClass = this;
JButton b = new JButton("Transfer");
b.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
fileTransfer.start();
Timer t = new Timer();
t.scheduleAtFixedRate(myClass, 0.0, 20);
}
});
}
// Update the UI here!
@Override
public void run()
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
jpb.setValue(fileTransfer.getTransferPercent());
}
});
}
}
答案 2 :(得分:-1)
我可能会以不同的方式设计。我将网络代码与UI无关,并让它只更新发送百分比的变量。
用户界面将使用计时器轮询此号码以更新进度条。
但是你的代码应该可行。尝试在运行功能上添加@Override。也许SwingUltities.invokeLater正在调用Runnable的run函数而不是你自己的。