Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jProgressBar не устанавливается значение, что я делаю не так? 
V
    Опции темы
Joil
  Дата 27.4.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: 1
Всего: 8



Привет всем. Короче такая ситуация. С прогресс баром не приходилось работать раньше (но вроде ни чего сложно го там нет). Почему не получается я просто недоумеваю.
Так вот,  есть класс MainFrame (ну понятно что там интерфейс (на основе свинга)), в нем есть статическое паблик поле jProgressBar progressBar (все инициализированно, все правильно, установлены min, msx и т. д.). Есть класс Core в нем метод который качает файл и в зависимости от этого меняет value у прогрессБара. Вот его код:
Код

private int quantity = 0;
...
public void copyFileOnDisc(String src, String dst) throws IOException {
        long filePersent = ftpClient.listFiles(src)[0].getSize() / 100;
        InputStream inputStream = ftpClient.retrieveFileStream(src);
        FileOutputStream fileOutputStream = new FileOutputStream(dst);
        long summ = 0;
        byte [] buffer = new byte[BUFFER_SIZE];
        int length = 0;
        quantity = 0;
        MainFrame.jProgressBar1.setValue(quantity);
        MainFrame.jProgressBar1.setString(quantity + "%");
        while (true) {
            length = inputStream.read(buffer);
            if (length != -1) {
                summ += length;
                if (summ > quantity * filePersent) {
                    quantity++;
                    MainFrame.jProgressBar1.setValue(quantity);
                    MainFrame.jProgressBar1.setString(quantity + "%");
                }
                fileOutputStream.write(buffer, 0, length);
            }
            else {
                quantity = 100;
                MainFrame.jProgressBar1.setValue(quantity);
                MainFrame.jProgressBar1.setString(quantity + "%");
                break;
            }
        }
        fileOutputStream.close();
        inputStream.close();
    }


Вот в общем прогресс бар не обновляется при скачивании (только в конце, когда поподает в else и устанавливается в 100).

До этого все было не так паршиво написано: прогресс бар был privete и не статик. И в интерфейсе создавался отдельный поток в котором обнавлялся прогресБар, беря значение quantity через метод get из Core ( ну по крайней мере я думаю что это более правильно чем сейчас). В общем так тоже ничего не работало (только из нуля сразу в сто в конце скачивания файла).
Я не понимаю почему так. Может кто подскажет в чес дело и за одно какие есть стандартные решения работы с прогрессБаром что бы не выпендриватся с отдельными потоками и паблик статик полями, если значение по которому должен менятся прогресс бар находится в другом классе.

--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
jk1
Дата 27.4.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Идея про отдельный поток изначально была верной, только обновление progress bar слеlовало принудительно выполнять на edt. Руками это делать надоедает, поэтому был придуман класс Swingworker он эффективно отделяет длительные операции от отрисовки и обработки событий. Вот пример использования:
Код

    public static class XeroxThread extends SwingWorker<Void, Void> implements ActionListener {

        // входной поток
        private InputStream input;
        // выходной поток
        private OutputStream output;
        // диалог-хозяин потока, ведет взаимодействие с пользователем
        private CopyProgressDialog owner;
        // размер сливаемого файла
        private long fileSize;

        /**
         * Конструктор потока для копирования файлов
         *
         * @param input    - поток для чтения из
         * @param output   - поток для записи в
         * @param owner    диалог-хозяин, которому отчитыаемся о выполнении
         * @param fileSize - размер файла для оценки временик копироваия
         */
        public XeroxThread(BufferedInputStream input, BufferedOutputStream output,
                           CopyProgressDialog owner, long fileSize) {
            this.input = input;
            this.output = output;
            this.owner = owner;
            this.fileSize = fileSize;
            this.addPropertyChangeListener(owner);
        }

        /**
         * Инициирует рекурсивное копирование в отджельном фоновом потоке
         *
         * @return формально ничего, кроме признака завершения операции
         * @throws Exception в случае косяков с потоками
         */
        protected Void doInBackground() throws Exception {
            Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
            int byteBuffer = input.read();
            int loaded = 0;
            while (byteBuffer != -1) {
                output.write(byteBuffer);
                setProgress((int) Math.ceil((double) 100 * ((float) ++loaded) / fileSize));
                byteBuffer = input.read();
            }
            output.flush();
            return null;
        }

        /**
         * Метод вызывается по завершении задачи и закрывает диалог копирования
         */
        protected void done() {
            owner.taskComplete();
        }
    }
}

Есть еще хорошая статья, там как раз примеры с progress bar 

Это сообщение отредактировал(а) jk1 - 27.4.2010, 22:13


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Joil
  Дата 28.4.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: 1
Всего: 8



jk1, спасибо за пример, ссылку и информацию. Понял в чем ошибался, пока ждал ответа. Сделал отдельный поток временно, сейчас разбираюсь со Swingworker. Очень полезная вещь.
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.