JProgressBar полоса загрузки – показываем прогресс выполнения
Июль 16, 2010 Комментарии (9)
Наконец-то добрался до прогрессбаров. Давным-давно один из посетителей, а именно товарищ Gorets хотел бы почитать про полосу загрузки. Заранее прошу прощения, что не оправдал ожиданий и написал так поздно, но работа съела всё время и высосала всю мотивацию из меня. А теперь давайте попробуем разобраться с компонентом JProgressBar, который необходимо использовать в своём приложении, если требуется показать прогресс выполнения какой-то продолжительной задачи. Эта задача запускается в рамках приложения и нужно дать пользователю понять, что что-то происходит. Если это возможно, то также неплохо было бы показать, когда закончится выполнение задачи, какой процент задачи выполнился и так далее. Для таких задач на индикаторе можно отображать процент выполнения или где-то рядом показать приблизительное время, через которое задача завершится. Однако, некоторые задачи не позволяют определить какие-то числовые характеристики продолжительности, в этом случае можно показать только анимированный прогресс. Давайте посмотрим на JProgressBar (именно с помощью него отрисовывается компонент прогресса на форме), изучим его основные методы и разберем простой тестовый пример. Хочется отметить, что JProgressBar часто используется не сам по себе а в купе с другими классами, такими как SwingWorker или ProgressMonitor. Но пока я решил посмотреть только на JProgressBar и “сварганить” очень простой пример. Использование JProgressBar вместе с другими служебными классами посмотрю попозжее. Скорее всего придется делать многопоточное приложение.
Для задач, время выполнения которых неизвестно можно использовать «бесконечный» JProgressBar. Такой прогресс бар не будет показывать конкретной цифры – процента выполнения задания и того, сколько еще осталось. Он будет лишь информировать пользователя о том, что что-то выполняется. Такой JProgressBar очень похож по сути на индикатор, который используется при загрузке веб-страничек – он только показывает загрузку и более ни о чем не говорит.
Чтобы получить «бесконечный» JProgressBar необходимо сделать вот так:
JProgressBar progressBar = new JProgressBar(); progressBar.setIndeterminate(true);
Затем остается только добавить полученный JProgressBar в нужное место окна приложения.
Такой прогресс бар, на мой взгляд, удобнее использовать в небольшом размере примерно вот так, как показано на рисунках ниже.
Второй тип JProgressBar допускает, что в процессе выполнения какой-то задачи можно в любой момент сказать о том, какой процент задания выполнен и сколько еще осталось. Для таких прогресс баров имеет место использование следующих методов. Метод setMinimum и setMaximum устанавливают соответственно минимальное и максимальное значения для прогресс бара. Метод setValue устанавливает значение, которое будет отображать JProgressBar.
К примеру, если сделать вот так:
JProgressBar progressBar = new JProgressBar(); progressBar.setStringPainted(true); progressBar.setMinimum(0); progressBar.setMaximum(100); progressBar.setValue(30);
то получим следующий результат
Метод setStringPainted говорит компоненту, отображать ли текстовую надпись или нет.
А теперь простой тестовый пример.
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();
}
});
}
}




Наконец-то добрался до прогрессбаров.
Саня, лучше бы ты в свой отпуск добрался к нам на собеседование
В конце лета доберусь, если нам бабла не подкинут
Читал? http://samolisov.blogspot.com/2010/02/blog-post.html
Прочитал. Чувачок всё грамотно разложил по полочкам. В закладки добавил – потом еще перечитаю
Наконец то и Горец дождался этой статьи, сейчас еще прочитаю и отпишу, если что-то не понравится =)
Да и еще, кампрады, может кто-то пользуется готовыми “движками” для программ?
Вот что я имею в виду, http://www.javaportal.ru/java/articles/gefdemo.html , если кто пользуется – хотелось бы почитать и про это, особенно статейку и примером элементарным и как это все подключается и т.д =)
Пока ничего не пробовал, но думаю попозжее возьму что-нибудь эдакое и попробую поюзать.
Спасибо за пример. Однако! Данный пример, как и “родной” пример от sun/oracle, не дает подсказки, что делать в случае действительно длинной вычислительной операции (без отдачи управления ОС). Проблема в том, что при длинной операции, видимо, события некому обрабатывать. Поэтому диалог, на котором расположен прогрессбар не обновляется, кнопки на нем до конца операции остаются не активными и т.д. Есть ли в Java какой-нибудь трюк для обработки событий в такой ситуации?
а разные потоки для этого разве не подойдут?
а реально-ли сделать, чтобы проценты выполнения были не по центру, а, например, слева?