当长时间下载完成后,我只想在帧的左下角添加不确定的JProgressBar动画。
我浏览了许多教程,但我都不清楚。我只是想在后台下载文件时使其具有动画效果。每个我试过这种方式,它不会动画进度条,直到 后 下载完成。
我需要知道我的download()调用位置的帮助。
class MyFunClass extends JFrame {
JProgressBar progressBar = new JProgressBar();
public void buttonClicked() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setIndeterminate(true);
progressBar.setVisible(true);
// Do I do my download() in here??
}});
// Do download() here???
progressBar.setVisible(false);
}
}
提前致谢!
编辑:
对于那些将来与我有类似问题的人,这是一个基本问题的基本解决方案。这不是逐字记录我的代码,而是一个概括的草图。内部buttonClicked()
:
public void buttonClicked() {
class MyWorker extends SwingWorker(String, Object) {
protected String doInBackground() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
// Do my downloading code
return "Done."
}
protected void done() {
progressBar.setVisible(false)
}
}
new MyWorker().execute();
}
您当前的代码未显示创建后台线程,而是显示了您尝试 从
Swing线程中将代码在Swing线程上排队,但这对这个问题没有意义(尽管有时您可能想做这个,但又不是这里)。成功的唯一方法是使用后台线程。标准的Oracle
JProgressBar教程和Swing中的并发性贯穿了所有这一切。
基本的事情是您必须从Swing线程更新JProgressBar,它将在后台线程中执行长时间运行的过程,例如SwingWorker对象提供的过程。这里有太多细节需要我们复查,所以我所能做的就是提供一个链接,但是一旦您阅读了教程,我们将很乐意帮助您理解这些细节。只需查看教程,然后再提出一些具体问题(如果您仍然感到困惑)。
编辑1
您声明:
我可以在buttonClicked()函数中创建一个新的线程对象吗?
是的,您可以在buttonClicked()
方法 内部创建一个SwingWorker对象,然后在其中执行它。
问题是我拥有开发GUI所要使用的所有功能的API和库,并且似乎很费力地将函数调用包装在线程中。
抱歉,但我不知道您在这里说什么或您认为线程将导致什么问题。该buttonClicked()
方法可能 必须 在EDT上运行,而不是在后台线程中运行。
还要注意,在大多数较复杂的Swing
GUI中,我经常在不同的(模型)对象中下载文件,并在与GUI对象(视图)不同的对象(控件)中创建SwingWorker。用这种方法执行起来似乎更复杂,但是用这种方法进行调试,维护和增强程序
要 容易得多,尤其是当我大量使用接口来允许我单独测试所有程序html" target="_blank">组件时。
编辑2
对解决方案帖子的一些更正。您发布了:
public void buttonClicked() {
class MyWorker extends SwingWorker(String, Object) {
protected String runInBackground() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
// ...
有问题
doInBackground()
,不是runInBackground()
所以改变它:
public void buttonClicked() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
class MyWorker extends SwingWorker<String, Void> {
protected String doInBackground() {
// ...
问题内容: Java中是否有类似“ typeof”的函数来返回原始数据类型(PDT)变量的类型或操作数PDT的表达式? 似乎仅适用于类类型。 问题答案: 请尝试以下操作: 它将打印: 至于,您可以使用其动态对应项:
问题内容: 我已经在SO和google上浏览了一段时间,以找到该问题的答案,但是我似乎找不到真正有效的方法。我将从头开始: 我用一个在后台运行批处理文件的方法创建了一个Java类(不显示命令窗口)。该程序运行良好,除了会使最终用户感到困惑之外,因为批处理文件需要一段时间才能完成-用户将不知道该程序是否仍在运行。批处理脚本执行完毕后,将显示一个消息对话框,说明已完成,但是在方法运行到对话框出现之间的
我已经浏览了SO和谷歌一段时间,想找到这个问题的答案,但我似乎找不到一个真正有效的答案。我将从头开始: 我用一个方法创建了一个Java类,该方法在后台运行一个批处理文件(命令窗口不会出现)。该程序运行得很好,只是最终用户会感到有点困惑,因为批处理文件需要一段时间才能完成——用户将不知道该程序是否仍在运行。批处理脚本完成执行后,会出现一个消息对话框,说明它已完成,但在方法运行和对话框出现之间的一段时
问题内容: 我正在尝试将JProgressBar添加到我的程序中,但不会更新!仅当原因为100%时,该值才会更改。这是我的方法。 更改进度栏的值位于上述方法的底部。 这就是我所谓的方法。 编辑:以上根本不是问题,问题之一是程序正在使用整数除法而不是十进制。 问题答案: 是一个整数,也是。因此发生的是小数被截断。你应该做什么,就像 这样做是确保将其除以具有十进制功能的数据类型,该数据类型将返回更具包
介绍 (Introduction) JProgressBar类是一个可视地显示某个任务进度的组件。 Class 声明 (Class Declaration) 以下是javax.swing.JProgressBar类的声明 - public class JProgressBar extends JComponent implements SwingConstants, Access
Springfox昂首阔步的用户界面有错误的基本网址。我不清楚19080端口从哪里来,因为没有服务监听该端口。我需要做什么设置才能让springfox生成正确的基本网址? Swagger UI http://dev.example.com/newapi/swagger-ui.html 错误的基本URL 基本URL:dev.example。com:19080/newapi 正确的基本URL 基本UR