Индикатор выполнения Java Swing для процесса загрузки

я использую функцию Java для загрузки файла из интернета.

public void getLatestRelease()
{
    try
    {
        // Function called
        long startTime = System.currentTimeMillis();

        // Open connection
        System.out.println("Connecting...");
        URL url = new URL(latestReleaseUrl);
        url.openConnection();

        // Download routine
        InputStream reader = url.openStream();
        FileOutputStream writer = new FileOutputStream("release.zip");

        byte[] buffer = new byte[153600];
        int totalBytesRead = 0;
        int bytesRead = 0;

        while ((bytesRead = reader.read(buffer)) > 0)
        {
            writer.write(buffer, 0, bytesRead);
            buffer = new byte[153600];
            totalBytesRead += bytesRead;
        }

        // Download finished
        long endTime = System.currentTimeMillis();

        // Output download information
        System.out.println("Done.");
        System.out.println((new Integer(totalBytesRead).toString()) + " bytes read.");
        System.out.println("It took " + (new Long(endTime - startTime).toString()) + " milliseconds.");

        // Close input and output streams
        writer.close();
        reader.close();
    }

    // Here I catch MalformedURLException and IOException :)
}

и JProgressBar компонент в my JPanel, который должен визуализировать прогресс загрузки:

private static void createProgressBar(JPanel panel)
{
    JProgressBar progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    panel.add(progressBar, BorderLayout.SOUTH);
}

я хотел бы отделить функции "back-end" от представлений "front-end", представленных пользователям, по аналогии с MVC в веб-приложениях.

Итак, функция getLatestRelease() лежит в пакете framework в классе MyFramework.

все, что связано с Swing генерация интерфейса, включая прослушиватели событий, находится в пакете frontend.

в основном Controller класс I создает экземпляр MyFramework и экземпляр ApplicationFrontend, который является основным классом .

вопросы Как обновить progressBar значением, в зависимости от загрузки?

1 ответов


когда вы хотите сделать MVC в swing,SwingWorker класс приходит на ум.
SwingWorker поставляется со свойством под названием "Прогресс", которое вы можете слушать с помощью PropertyChangeListener.

события прогресса могут быть уволены из swingworker, используя его setProgress(int 0-100) метод. Итак, вот он для загрузки файла в фоновом режиме с понятием прогресса (обратите внимание, что вам нужно будет иметь представление о размере файла, чтобы иметь возможность вычислить процент прогресса).

показывать прогресс можно сделать, используя два варианта: A JProgressBar для полного контроля, или ProgressMonitor чтобы показать почти самоуправляемое всплывающее окно с индикатором прогресса в нем. Вижу учебник чтобы увидеть различия.

Решение 1

как говорится, если вы идете на ProgressMonitor и ваша фоновая задача-чтение из InputStream можно использовать ProgressMonitorInputStream класс для чтения и отображения прогресса, не беспокоясь о вызове setProgress или прослушивании к свойству "прогресс".

решение 2

если вы хотите сделать это вручную, создайте задачу загрузки SwingWorker, которая вызывает setProgress по мере ее выполнения, создайте экземпляр ProgressMonitor (или JProgressBar) по мере необходимости, зарегистрируйте PropertyChangeListener на своем SwingWorker, который проверяет изменения "прогресс" и обновляет монитор/бар соответственно.

Примечание: важно пройти через PropertyChangeListener, потому что он отделяет модель (задача) из представления (компонент хода выполнения swing) и соблюдать правила использования EDT.