JProgressBar полоса загрузки — показываем прогресс выполнения

Использование JProgressbar Наконец-то добрался до прогрессбаров. Давным-давно один из посетителей, а именно товарищ Gorets хотел бы почитать про полосу загрузки. Заранее прошу прощения, что не оправдал ожиданий и написал так поздно, но работа съела всё время и высосала всю мотивацию из меня. А теперь давайте попробуем разобраться с компонентом JProgressBar, который необходимо использовать в своём приложении, если требуется показать прогресс выполнения какой-то продолжительной задачи. Эта задача запускается в рамках приложения и нужно дать пользователю понять, что что-то происходит. Если это возможно, то также неплохо было бы показать, когда закончится выполнение задачи, какой процент задачи выполнился и так далее. Для таких задач на индикаторе можно отображать процент выполнения или где-то рядом показать приблизительное время, через которое задача завершится. Однако, некоторые задачи не позволяют определить какие-то числовые характеристики продолжительности, в этом случае можно показать только анимированный прогресс. Давайте посмотрим на JProgressBar (именно с помощью него отрисовывается компонент прогресса на форме), изучим его основные методы и разберем простой тестовый пример. Хочется отметить, что JProgressBar часто используется не сам по себе а в купе с другими классами, такими как SwingWorker или ProgressMonitor. Но пока я решил посмотреть только на JProgressBar и «сварганить» очень простой пример. Использование JProgressBar вместе с другими служебными классами посмотрю попозжее. Скорее всего придется делать многопоточное приложение.

Для задач, время выполнения которых неизвестно можно использовать «бесконечный» JProgressBar. Такой прогресс бар не будет показывать конкретной цифры – процента выполнения задания и того, сколько еще осталось. Он будет лишь информировать пользователя о том, что что-то выполняется. Такой JProgressBar очень похож по сути на индикатор, который используется при загрузке веб-страничек – он только показывает загрузку и более ни о чем не говорит.

Чтобы получить «бесконечный» JProgressBar необходимо сделать вот так:

JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);

Затем остается только добавить полученный JProgressBar в нужное место окна приложения.

Использование JProgressBar

Такой прогресс бар, на мой взгляд, удобнее использовать в небольшом размере примерно вот так, как показано на рисунках ниже.

Использование JProgressBar

Использование JProgressBar

Второй тип JProgressBar допускает, что в процессе выполнения какой-то задачи можно в любой момент сказать о том, какой процент задания выполнен и сколько еще осталось. Для таких прогресс баров имеет место использование следующих методов. Метод setMinimum и setMaximum устанавливают соответственно минимальное и максимальное значения для прогресс бара. Метод setValue устанавливает значение, которое будет отображать JProgressBar.

К примеру, если сделать вот так:

JProgressBar progressBar = new JProgressBar();
progressBar.setStringPainted(true);
progressBar.setMinimum(0);
progressBar.setMaximum(100);
progressBar.setValue(30);

то получим следующий результат

Использование JProgressBar

Метод setStringPainted говорит компоненту, отображать ли текстовую надпись или нет.

А теперь простой тестовый пример.

Использование JProgressbar

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class TestFrame extends JFrame {
	
	static private int BOR = 10;

	public static void createGUI() {
		final JFrame frame = new JFrame("Test frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();
		panel.setBorder(BorderFactory.createEmptyBorder(BOR, BOR, BOR, BOR));
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		
		panel.add(Box.createVerticalGlue());
		
		JProgressBar progressBar1 = new JProgressBar();
		progressBar1.setIndeterminate(true);		
		panel.add(progressBar1);
		
		panel.add(Box.createVerticalGlue());
		
		final JProgressBar progressBar2 = new JProgressBar();
		progressBar2.setStringPainted(true);
		progressBar2.setMinimum(0);
		progressBar2.setMaximum(100);
		panel.add(progressBar2);
		
		panel.add(Box.createVerticalGlue());
		
		JPanel buttonsPanel = new JPanel();
		buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS));
		
		buttonsPanel.add(Box.createHorizontalGlue());
		
		JButton increment = new JButton("+10%");
		increment.addActionListener(new ActionListener() {			
			public void actionPerformed(ActionEvent e) {
				int value = progressBar2.getValue() + 10;
				int maximum = progressBar2.getMaximum();
				if(value > maximum) {
					value = maximum;
				}				
				progressBar2.setValue(value);
			}
		});
		buttonsPanel.add(increment);
		
		buttonsPanel.add(Box.createHorizontalGlue());
		
		JButton decrement = new JButton("-10%");
		decrement.addActionListener(new ActionListener() {			
			public void actionPerformed(ActionEvent e) {
				int value = progressBar2.getValue() - 10;
				int minimum = progressBar2.getMinimum();
				if(value < minimum) {
					value = minimum;
				}				
				progressBar2.setValue(value);
			}
		});
		buttonsPanel.add(decrement);
		
		buttonsPanel.add(Box.createHorizontalGlue());
		
		panel.add(buttonsPanel);
		
		panel.add(Box.createVerticalGlue());
		
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(panel, BorderLayout.CENTER);

		frame.setPreferredSize(new Dimension(260, 225));
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				createGUI();
			}
		});
	}

}
Реклама

11 Responses to JProgressBar полоса загрузки — показываем прогресс выполнения

  1. sandlex says:

    Наконец-то добрался до прогрессбаров.

    Саня, лучше бы ты в свой отпуск добрался к нам на собеседование 🙂

  2. Gorets says:

    Наконец то и Горец дождался этой статьи, сейчас еще прочитаю и отпишу, если что-то не понравится =)
    Да и еще, кампрады, может кто-то пользуется готовыми «движками» для программ?
    Вот что я имею в виду, http://www.javaportal.ru/java/articles/gefdemo.html , если кто пользуется — хотелось бы почитать и про это, особенно статейку и примером элементарным и как это все подключается и т.д =)

    • bondforever says:

      Пока ничего не пробовал, но думаю попозжее возьму что-нибудь эдакое и попробую поюзать.

  3. АВС says:

    Спасибо за пример. Однако! Данный пример, как и «родной» пример от sun/oracle, не дает подсказки, что делать в случае действительно длинной вычислительной операции (без отдачи управления ОС). Проблема в том, что при длинной операции, видимо, события некому обрабатывать. Поэтому диалог, на котором расположен прогрессбар не обновляется, кнопки на нем до конца операции остаются не активными и т.д. Есть ли в Java какой-нибудь трюк для обработки событий в такой ситуации?

  4. Гаяз says:

    а реально-ли сделать, чтобы проценты выполнения были не по центру, а, например, слева?

  5. Mirimas says:

    Поддерживаю АВС. Данная статья просто перепечаток из документации. В идеале бы рассмотреть ситуацию с зависанием прогрессбара с использованием мультитеарда.

  6. Sasha says:

    Круто, попробовал в ЭКЛИПСЕ, сработало. Ты крутой !

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: