Thread.sleep не работает в ActionListner
Ищу решение проблемы в сети - не могу найти. Хочу сделать, чтоб при нажатии на кнопку ProgressBar заполнялся от 1 до 100, но почему-то он не показывает, что заполняется ежесекундно, а, только когда полностью пройдет 100 секунд, показывает его заполнение.
Причем если делать это не в ActionListner то все работает...
public class Frame {
public static void main(String[] args) {
JFrame frame = getFrame();
JProgressBar progressBar = new JProgressBar();
JPanel panel = new JPanel();
JButton button = new JButton();
frame.add(panel);
panel.add(button);
panel.add(progressBar);
progressBar.setStringPainted(true);
progressBar.setMinimum(0);
progressBar.setMaximum(100);
progressBar.setVisible(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
progressBar.setValue(i);
}
}
});
}
static JFrame getFrame() {
JFrame frame = new JFrame() { };
frame.setSize(600, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout());
frame.setVisible(true);
return frame;
}
}
Ответы (2 шт):
потому что обычный Thread.sleep вводит в сон ВСЁ активити.
для решения этой проблемы попробуйте использовать поток:
Thread s1 = new Thread(new Runnable(){
public void run(){
// code
}
});
s1.start();
В вашем случае это (может где-то ошибка. я не проверял ваш пример):
Thread s1 = new Thread(new Runnable(){
public void run(){
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
progressBar.setValue(i);
}
}
});
s1.start();
Вы вешаете этот код на кнопку Listener. Запускается отдельный поток, который сам себе что-то считает, ждет, изменяет независимо от всего остального.
p.s. Еще одним решением может быть знакомство с ExecutorService.
вот отличная ссылка: https://habr.com/ru/post/116363/
Проснулся с утра и на свежую голову вроде как пришло решение , наткнулся на класс Timer начал читать и увидел что там можно планировать задачи, вобщем изменил код . Я далеко не прогер , а так после работы в свободное время по немногу учусь делать всякую ерунду , просто интересно)). Таймер я так понимаю у меня работает без остановки , как его остановить теперь вопрос?
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
progressBar.setValue(progressBar.getValue() + 1);
}
};
Timer timer = new Timer("Timer");
long delay = 1000;
timer.schedule(timerTask, delay, 1000);
}
});