Java updateProgress()方法不工作

Java updateProgress()方法不工作,java,javafx,Java,Javafx,我已经在这个论坛上发布了以下版本的代码。代码应该从URL下载给定的文件并显示下载进度。它能够检索文件大小并打印“下载成功”。它也会按照指示在服务器上执行操作。但是,所选位置既没有下载,也没有进度指示器显示任何进度。似乎updateProgress()方法什么都不做。这是某种缺陷、逻辑缺陷还是平台不兼容?我在Windows 8.1 64位的NetBeans 8.1上使用JDK 1.8.0101 这是代码 public class FileLength extends Application { B

我已经在这个论坛上发布了以下版本的代码。代码应该从URL下载给定的文件并显示下载进度。它能够检索文件大小并打印“下载成功”。它也会按照指示在服务器上执行操作。但是,所选位置既没有下载,也没有进度指示器显示任何进度。似乎updateProgress()方法什么都不做。这是某种缺陷、逻辑缺陷还是平台不兼容?我在Windows 8.1 64位的NetBeans 8.1上使用JDK 1.8.0101

这是代码

public class FileLength extends Application {
BorderPane root;    
String url;
File file;
ProgressIndicator pi;
Stage stage;
public void start(Stage primaryStage) 
{
    stage = primaryStage;
    DownloadTask task = new DownloadTask();
    Button btn = new Button();
    btn.setText("Get File");
    btn.setOnAction(new EventHandler<ActionEvent>()
    {

        public void handle(ActionEvent event)
        {
            FileChooser fileSaver = new FileChooser();
            fileSaver.getExtensionFilters().add(new FileChooser.ExtensionFilter("ZIP", ".zip"));                

            file = fileSaver.showSaveDialog(stage);
            new Thread(task).start();
        }
    });

    root = new BorderPane();        
    root.setBottom(btn);

    pi = new ProgressIndicator();
    pi.progressProperty().bind(task.progressProperty());
    /* why this is not binding? */
    root.setTop(pi);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Download progress");
    primaryStage.setScene(scene);
    primaryStage.show();
}

private  class DownloadTask extends Task<Void>
{
    protected Void call()
    {
        try
        {
            URL url = new URL("http://downloads.sourceforge.net/project/bitcoin/Bitcoin/blockchain/bitcoin_blockchain_170000.zip");
            /* url is for example only */

            HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection());
            long completeFileSize = httpConnection.getContentLength();
            System.out.println("File size:" + completeFileSize );

            InputStream is = httpConnection.getInputStream();
            OutputStream os = new FileOutputStream(file);

            long downloadedFileSize = 0L;
            byte[] buf = new byte[1024];
            int n = 0;

            while ((n = is.read(buf, 0, 1024)) >= 0) 
            {                   
                downloadedFileSize += n;
                updateProgress(downloadedFileSize, completeFileSize);
                /* why this is not updating progress?*/
                os.write(buf, 0, n);                   
            }
            is.close();
            os.close();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }            

        return null;
    }
    protected void succeeded()
    {
        // this executes
        System.out.println("Download succeeded");
        root.getChildren().remove(pi);
    }
    protected void failed()
    {
        System.out.println("Download failed");
    }  
}
public static void main(String[] args)
{
    launch(args);
} }
公共类文件长度扩展应用程序{
边缘根;
字符串url;
文件;
进度指标pi;
阶段性;
公共无效开始(阶段primaryStage)
{
阶段=初级阶段;
DownloadTask任务=新建DownloadTask();
按钮btn=新按钮();
setText(“获取文件”);
btn.setOnAction(新的EventHandler()
{
公共无效句柄(ActionEvent事件)
{
FileChooser fileSaver=新建FileChooser();
fileSaver.getExtensionFilters().add(新的FileChooser.ExtensionFilter(“ZIP”,“.ZIP”));
file=fileSaver.showsavedilog(stage);
新线程(任务).start();
}
});
root=新边框窗格();
根立根(btn);
pi=新的ProgressIndicator();
pi.progressProperty().bind(task.progressProperty());
/*为什么这不具有约束力*/
根.setTop(pi);
场景=新场景(根,300,250);
setTitle(“下载进度”);
初级阶段。场景(场景);
primaryStage.show();
}
私有类下载任务扩展任务
{
受保护的无效调用()
{
尝试
{
URL=新URL(“http://downloads.sourceforge.net/project/bitcoin/Bitcoin/blockchain/bitcoin_blockchain_170000.zip");
/*url只是一个例子*/
HttpURLConnection httpConnection=(HttpURLConnection)(url.openConnection());
long completeFileSize=httpConnection.getContentLength();
System.out.println(“文件大小:“+completeFileSize”);
InputStream=httpConnection.getInputStream();
OutputStream os=新文件OutputStream(文件);
长下载文件大小=0L;
字节[]buf=新字节[1024];
int n=0;
而((n=is.read(buf,0,1024))>=0)
{                   
下载文件大小+=n;
updateProgress(下载的文件大小,completeFileSize);
/*为什么这不是更新进度*/
os.write(buf,0,n);
}
is.close();
os.close();
}
捕获(例外e)
{
System.out.println(e.getMessage());
}            
返回null;
}
受保护的无效已成功()
{
//执行
System.out.println(“下载成功”);
root.getChildren().remove(pi);
}
受保护的void失败()
{
System.out.println(“下载失败”);
}  
}
公共静态void main(字符串[]args)
{
发射(args);
} }

选择一个有效的URL,一切都会好起来。当我用一个合适的URL替换它时,它对我来说很好。代码中的一个使用重定向。我用了
http://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.fa.gz< /代码>(来自加利福尼亚大学圣克鲁斯的完整人类基因组)。注意:某些URL可能不提供内容大小,在这种情况下,进度保持不确定(内容大小为-1,因此进度<0,这被解释为不确定)。否。但它仍然不起作用。我只知道文件的大小。没有下载。进度指示器也没有显示进度。这是一个奇迹!你真的编译并运行了代码吗?你下载文件了吗?我也试过了。使用有效的URL,它将按预期工作。是。它为一首mp3歌曲工作。可能是URL的问题。谢谢你的宝贵意见。我仍在完善和重新测试这段代码。如果有什么问题,我一定会告诉你的。由于工作不周,我非常沮丧。再次感谢。