Java Swing 上传进度条

Java Swing 是一种用于创建图形用户界面 (GUI) 的框架。它提供了丰富的工具和组件,可以使开发人员轻松地构建跨平台的应用程序。本文将介绍如何使用 Java Swing 创建一个带有上传进度条的界面,并提供代码示例。

什么是上传进度条?

上传进度条是在文件上传过程中显示进度的一种图形化工具。它可以告诉用户当前上传的文件的完成百分比,使用户能够清楚地了解文件上传的进度。

使用 Java Swing 创建上传进度条

为了创建一个带有上传进度条的界面,我们需要使用以下组件和技术:

  • JFileChooser:用于选择要上传的文件。
  • JProgressBar:用于显示上传进度。
  • SwingWorker:用于在后台线程中执行上传操作。

步骤 1:创建 GUI 界面

首先,我们需要创建一个基本的 GUI 界面,其中包含一个按钮和一个进度条。用户点击按钮后,将打开文件选择对话框。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class UploadProgressBarDemo extends JFrame {

    private JButton uploadButton;
    private JProgressBar progressBar;

    public UploadProgressBarDemo() {
        // 设置窗口标题
        setTitle("Upload Progress Bar Demo");
        // 设置窗口大小和布局
        setSize(300, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new FlowLayout());

        // 创建按钮和进度条
        uploadButton = new JButton("Upload");
        progressBar = new JProgressBar(0, 100);
        progressBar.setStringPainted(true);

        // 将按钮和进度条添加到窗口
        getContentPane().add(uploadButton);
        getContentPane().add(progressBar);

        // 添加按钮点击事件监听器
        uploadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 在此处执行上传操作
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new UploadProgressBarDemo().setVisible(true);
            }
        });
    }
}

步骤 2:选择文件

在按钮的点击事件监听器中,我们可以使用 JFileChooser 组件来选择要上传的文件。在选择文件后,我们可以获取其大小并更新进度条的最大值。

uploadButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // 创建文件选择器
        JFileChooser fileChooser = new JFileChooser();
        int result = fileChooser.showOpenDialog(UploadProgressBarDemo.this);
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            long fileSize = file.length();
            progressBar.setMaximum((int) fileSize);
            
            // 在此处执行上传操作
        }
    }
});

步骤 3:执行上传操作

为了避免在主线程中执行耗时的上传操作,我们可以使用 SwingWorker 类在后台线程中执行上传操作。在上传过程中,我们可以根据上传的字节数更新进度条的值。

uploadButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // 创建文件选择器
        JFileChooser fileChooser = new JFileChooser();
        int result = fileChooser.showOpenDialog(UploadProgressBarDemo.this);
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            long fileSize = file.length();
            progressBar.setMaximum((int) fileSize);
            
            // 使用 SwingWorker 在后台线程中执行上传操作
            SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
                @Override
                protected Void doInBackground() throws Exception {
                    // 执行上传操作
                    FileInputStream fis = new FileInputStream(file);
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    int totalBytesRead = 0;
                    while ((bytesRead = fis.read(buffer)) != -1) {
                        // 更新进度条的值
                        totalBytesRead += bytesRead;
                        publish(totalBytesRead);
                    }
                    
                    fis.close();
                    return null;
                }
                
                @Override
                protected void process(List<Integer> chunks) {
                    // 更新进度条的值
                    int latestBytesRead = chunks.get(chunks.size() - 1);
                    progressBar.setValue(latestBytesRead);
                }
                
                @Override
                protected void done() {
                    // 上传完成后的操作
                    progressBar.setValue(progressBar