gpt4 book ai didi

java - 在另一个线程中下载文件并等待主线程中的进度会卡住 JFrame 的渲染

转载 作者:行者123 更新时间:2023-12-01 22:16:47 24 4
gpt4 key购买 nike

我正在运行一个下载线程 (InstallThread) 以将一些文件从服务器 (60KB) 获取到文件夹中。每个文件下载完成后,线程类 (InstallThread) 会将其 percent 字符串变量的值更改为当前进度。

下载完所有文件后,done boolean 值将设置为 true。

同时,JPanel(在全局线程上运行)不断检查 InstallThread 的当前进度(百分比),并设置已显示的 JLabel 的文本, installingLabel 为当前百分比。

JPanel 还会检查 done 变量,这会导致 while 循环停止并且应用程序继续。

什么不起作用:下载文件时,JPanel 不会渲染任何内容(没有背景色,并且 JLabel 不会出现,即使标签在 while 循环之前可见)已启动),并且 JFrame 卡住。

有效方法:在 JFrame 卡住时下载文件,完成后,JPanel 的 while 循环中断,应用程序继续运行。

最后是代码:

FrameDisplay.java#draw_INSTALL(Graphics2D g2d);(JPanel 扩展类)

installingLabel.setVisible(true);

InstallThread installThread = new InstallThread();
installThread.start();

while (!installThread.done) {
installingLabel.setText(installThread.percent);
}

/* We continue on with the application */

DotChaser.getInstance().setStage(Stage.MAIN_MENU);

InstallThread.java

int quota = 62000;
int downloaded = 0;

for (String s : files) { // files is an array with all the files to download
String url =<The server URL > +s;
File destination = new File( < The destination folder>+s);

DownloadThread downloadThread = new DownloadThread(url, destination);
downloadThread.start(); // DownloadThread is simply downloading the files.

while (!downloadThread.done) {
System.out.print("");
}


downloaded += destination.length();

percent = (int) (((double) downloaded / (double) quota) * 100) + "%";
}

done = true;

最佳答案

您将否定使用后台线程和如下代码的所有好处:

while (!installThread.done) {
installingLabel.setText(installThread.percent);
}

因为这将完全占用 Swing 事件线程,卡住您的程序。

相反,请使用某种类型的通知系统。我自己会使用 SwingWorker,向工作线程添加一个 PropertyChangeListener 并响应 SwingWorker.StateValue.DONE 的 newValue。您可以使用相同的 PropertyChangeListener 来接收 SwingWorker 进度属性更改的通知,并使用它来更新下载状态。

请看一下:

关于java - 在另一个线程中下载文件并等待主线程中的进度会卡住 JFrame 的渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com