0

我正在尝试创建一个简单的程序,它将为我上传一些文件到 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 并没有真正发挥应有的作用。当我按下上传按钮时,上传开始(并完成),但标签上的文本不会改变,进度条也不会改变。它们仅在上传完成时更改。

完整的源代码可以在这里找到:代码

有什么建议么?PS在java中相当新:)

4

2 回答 2

4

您正在事件调度线程中进行上传。所以在同一个线程中执行的绘画代码,直到上传完成后才能执行。事件处理代码应该尽快完成。如果你有一个很长的任务要执行,它应该在一个单独的后台线程中执行。

使用 SwingWorker 做你想做的事。它的 javadoc有一个易于理解的示例。

于 2011-12-31T13:59:35.613 回答
3

我第二个 JB Nizet,在某些情况下,使用后台线程而不是事件调度线程可以防止用户界面在任务运行时冻结。

java教程中的仅供参考,

Swing 程序员处理以下类型的线程:

  • Initial threads,执行初始应用程序代码的线程。

  • 事件调度线程,所有事件处理代码都在其中执行。大多数与 Swing 框架交互的代码也必须在这个线程上执行。

  • 工作线程,也称为后台线程,执行耗时的后台任务。
于 2011-12-31T14:07:19.907 回答