我试图创建一个简单的程序,将我的几个文件上传到Windows共享。我有所有的基本功能,但我有一些收尾的问题。我有一个GUI,我只想显示一些有关上传的信息 - 进度条和标签。这是代码:
private void btn_UploadActionPerformed(java.awt.event.ActionEvent evt) {
upl.setFiles(files);
for(int i = 0; i < files.length; i++){
progressLabel.setText("Uploading " + files[i].getName());
upl.uploadFile(i);
uploadProgress.setValue(uploadProgress.getValue() + 90/files.length);
}
uploadProgress.setValue(100);
}
当用户按下上传按钮时执行该操作。问题是,setText和setValue确实不能正常工作。当我按上传按钮时,上传开始(并结束),但标签上的文字不会改变,进度条也不会改变。它们仅在上传完成后才会更改。
可以在此处找到完整的源代码:Code
有什么建议吗? 附:相当新的java:)
答案 0 :(得分:4)
您正在事件派发线程中进行上传。因此,在上传完成之前,无法执行在同一线程中执行的绘制代码。事件处理代码应尽快完成。如果你有一个很长的任务要执行,它应该在一个单独的后台线程中执行。
使用SwingWorker执行您想要的操作。 Its javadoc有一个易于理解的例子。
答案 1 :(得分:3)
我是第二个JB Nizet,在某些情况下,使用后台线程而不是事件派发线程可以防止用户界面在任务运行时冻结。
来自java教程的费用,
Swing程序员处理以下类型的线程:
初始线程 ,执行初始应用程序代码的线程。
事件调度线程 ,其中执行所有事件处理代码。大多数与Swing框架交互的代码也必须在此线程上执行。