Bil*_* VB 6 java swing swingworker jprogressbar progress-bar
我只是想在进行长时间下载时在框架的左下角设置一个不确定的JProgressBar动画.
我看了很多教程,其中没有一个对我很清楚.我只是想在后台下载文件时让它具有动画效果.每个我试过这种方式,它不会动画进度条,直到后下载完成.
我需要帮助知道下载()调用的位置.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑:对于那些将来遇到类似问题的人来说,这是基本问题的基本解决方案.这不是我的代码,而是一般草图.内部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();
}
Run Code Online (Sandbox Code Playgroud)
您当前的代码显示没有创建后台线程,而是显示您尝试从 Swing线程中对Swing线程中的代码进行排队,这对于此问题没有意义(尽管有时您可能想要这样做这,但是,再次,不在这里).成功的唯一方法是使用后台线程.标准的Oracle JProgressBar教程和Swing中的Concurrency都经历了这一切.
基本的是你必须从Swing Thread更新JProgressBar才能在后台线程中执行长时间运行的进程,例如SwingWorker对象提供的进程.我们在这里审查的细节太多了,所以我所能做的就是提供一个链接,但是一旦您查看了教程,我们将很乐意帮助您了解详细信息.如果您仍然遇到问题,请查看教程并回答您的具体问题.
编辑1
您说明:
我可以在buttonClicked()函数中创建一个新的线程对象吗?
是的,您可以在buttonClicked() 方法内部创建SwingWorker对象并在那里执行它.
问题是我拥有我正在开发GUI的所有功能的API和库,并且它似乎是一个在线程中包装该函数调用的长途解决方法.
对不起,但我不知道你在这里说什么,或者你认为线程会导致什么问题.该buttonClicked()方法可能必须在EDT上运行,而不是在后台线程中运行.
另请注意,在我的大多数复杂的Swing GUI中,我经常在不同的(模型)对象中进行文件下载,并在GUI对象(视图)中的另一个对象(控件)中创建我的SwingWorker.这样做可能看起来更复杂,但是当我这样做时调试,维护和增强我的程序要容易得多,特别是当我大量使用接口允许我单独测试所有程序组件时.
编辑2
对解决方案帖子的一些更正.你发布了:
public void buttonClicked() {
class MyWorker extends SwingWorker(String, Object) {
protected String runInBackground() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
// ...
Run Code Online (Sandbox Code Playgroud)
有问题
doInBackground(),不是runInBackground()所以改变它:
public void buttonClicked() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
class MyWorker extends SwingWorker<String, Void> {
protected String doInBackground() {
// ...
Run Code Online (Sandbox Code Playgroud)