Постоянное обновление JLabel
Хочу сделать часы на Java (Swing) и тут возникла проблема. Сначала я хотел сделать обновление через бесконечный цикл, но в таком случае происходит зависание программы или бесконечное создание Frame-ов. Сейчас не заю как реализовать, есть предположение что можно сделать через многопоточность. Посоветуйте как мне это сделать.
Ответы (1 шт):
Вот пример кода
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class TestSwing extends JFrame {
public static void main(String[] args) {
TestSwing jFrame = new TestSwing();
JLabel timeLabel = new JLabel();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//###
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
LocalDateTime now = LocalDateTime.now();
String nowFormatted = dateTimeFormatter.format(now);
SwingUtilities.invokeLater(() -> timeLabel.setText(nowFormatted));
}, 0, 1, TimeUnit.SECONDS);
//###
jFrame.setSize(300,300);
jFrame.add(timeLabel);
jFrame.setVisible(true);
}
}
Ключевые строчки обрамлены в //###
ScheduledExecutorService используется для того, чтобы раз в секунду (смотри 3 и 4 параметры), начиная с нулевым делеем (смотри 2 параметр) вызывать какое-то действие ( смотри 1 параметр).
В нашем случае действие - взять текущую дату, отформатировать ее и проставить форматированное время в label.
Тут стоит обратить внимание, что нам обязательно нужен метод SwingUtilities.invokeLater - потому что мы данные в JLabel обновляем не в Swing потоке( тут чутка детальнее написано про данный метод)