发送文件时无法更新GUI

时间:2014-01-11 17:42:23

标签: java multithreading swing event-dispatch-thread jprogressbar

我正在使用套接字通过网络发送文件。正确接收文件没有任何问题。但现在我使用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

3 个答案:

答案 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函数而不是你自己的。