Примеры, описанные в этой статье, позволяют реализовать динамическое отображение времени в интерфейсе Java. Конкретные методы реализации резюмируются следующим образом:
1. Метод 1 использует TimerTask:
Используйте java.util.Timer и java.util.TimerTask для динамических обновлений. В конце концов, каждое обновление можно рассматривать как происходящее раз в 1 секунду.
Код выглядит следующим образом:
импорт java.awt.Dimension;импорт java.text.SimpleDateFormat;импорт java.util.Calendar;импорт java.util.Date;импорт java.util.Timer;импорт java.util.TimerTask;импорт javax.swing.JFrame;импорт javax.swing.JLabel;import javax.swing.JPanel;/** * Этот класс представляет собой простую реализацию JFrame, объясняющую, как для * динамического отображения времени в интерфейсе на основе JSwing. * @author Edison * */public class TimeFrame расширяет JFrame{ /* * Variables */ Private JPanel timePanel; Private JLabel displayArea; Private String DEFAULT_TIME_FORMAT = "HH: мм:сс"; частное время String; частное int ONE_SECOND = 1000; public TimeFrame() { timePanel = new JPanel(); timeLabel = new JLabel("CurrentTime: "); displayArea = new JLabel(); timePanel.add(timeLabel); timePanel.add(displayArea); this.setDefaultCloseOperation; (EXIT_ON_CLOSE) this.setSize(новое измерение(200,70)); this.setLocationRelativeTo(null); } /** * Этот метод создает задачу таймера для обновления времени в секунду */ Private void configTimeArea() { Timer tmr = new Timer(); tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Задача таймера для обновления области отображения времени * */ protected class JLabelTimerTask расширяет TimerTask { SimpleDateFormat dateFormatter = new SimpleDateFormat (DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); main(String arg[]) {TimeFrame timeFrame=new TimeFrame(); timeFrame.setVisible(истина) } }
Наследуйте TimerTask, чтобы создать пользовательскую задачу, получить текущее время и обновить displayArea.
Затем создайте экземпляр таймера и выполняйте задачу таймера каждую 1 секунду. Поскольку при использовании расписания могут возникнуть ошибки времени, метод ScheduleAtFixedRate с более высокой точностью вызывается напрямую.
2. Способ 2. Использование потоков:
Это относительно просто. Конкретный код выглядит следующим образом:
импортировать java.awt.Dimension;импортировать java.text.SimpleDateFormat;импортировать java.util.Calendar;импортировать javax.swing.JFrame;импортировать javax.swing.JLabel;импортировать javax.swing.JPanel;/** * Этот класс является простая реализация JFrame, объясняющая, как * динамически отображать время в интерфейсе на основе JSwing * @author Edison * */public class DTimeFrame2 расширяет JFrame. реализует Runnable {частный JPanel timePanel; частный JLabel timeLabel; частная строка DEFAULT_TIME_FORMAT = "ЧЧ: мм: сс"; частный int ONE_SECOND = 1000; общественный DTimeFrame2 () {timePanel = новый JPanel (); = новый JLabel("CurrentTime: "); displayArea = новый JLabel(); timePanel.add(timeLabel); this.add(timePanel); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setSize(new Dimension(200,70)); } public void run() { while(true) { SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); displayArea.setText(dateFormatter.format( Calendar.getInstance().getTime())); try { Thread.sleep(ONE_SECOND); } catch(Exception e) { displayArea.setText("Ошибка!!! "); } } } public static void main(String arg[]) { DTimeFrame2 df2 = новый DTimeFrame2 (); df2.setVisible (истина); Thread thread1 = новый Thread (df2);
Сравнивать:
Лично я предпочитаю первый метод, потому что Timer может использоваться несколькими TimerTasks, а создание потока увеличит сложность обслуживания многопотоков.
Обратите внимание на следующий код:
jFrame.setDefaultCloseOperation(); // Добавляем особое поведение к кнопке закрытия jFrame.setLocationRelativeTo(null); // Сделайте так, чтобы фрейм появлялся в середине экрана, а не в верхнем левом углу.
Немного изменив описанный выше метод, вы можете отображать время в нескольких странах. Код выглядит следующим образом:
импорт java.awt.BorderLayout; импорт java.awt.event.ActionEvent; импорт java.awt.event.ActionListener; импорт java.text.SimpleDateFormat; импорт java.util.Calendar; импорт java.util.Date; импорт java.util .Locale;импорт java.util.TimeZone;импорт java.util.Timer;импорт java.util.TimerTask;import javax.swing.DefaultComboBoxModel;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * Простые мировые часы * @author Edison * */public class WorldTimeFrame расширяет JFrame{ /** * */ Private static Final Long SerialVersionUID = частная строка timePanel; частный TimeZone timeZone; частный JLabel displayArea; частный int ONE_SECOND = 1000; частный String DEFAULT_FORMAT = "EEE d MMM, HH:mm:ss"; JComboBox(); timePanel = new JPanel(); displayArea = new JLabel(); timeZone = TimeZone.getDefault(); ZoneBox.setModel(new DefaultComboBoxModel(TimeZone.getAvailableIDs())); ZoneBox.addActionListener(new ActionListener()); @Override public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String)zoneBox.getSelectedItem())); configTimeArea(); timePanel.add(displayArea); this.setLayout(new BorderLayout()); СЕВЕР); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); package(); } /** * Этот метод создает задачу таймера для обновления времени в секунду */ Private void configTimeArea() { Таймер tmr = новый таймер(); tmr.scheduleAtFixedRate(новый; JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Задача таймера для обновления области отображения времени * */ public class JLabelTimerTask расширяет TimerTask { SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH); @Override public); void run () { dateFormatter.setTimeZone (timeZone время =); dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); } } /** * Обновление timeZone * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone } Public static void main(String arg[]) {new WorldTimeFrame() };
Первоначально displayArea необходимо обновить в updateTimeZone(TimeZone newZone). Однако, учитывая, что время выполнения TimerTask слишком мало, всего 1 секунда, невооруженным глазом, это по сути то же самое, что немедленное обновление. Если время выполнения TimerTask велико, displayArea следует обновить немедленно и осторожно.
Пополнить:
① package() используется для автоматического расчета размера экрана;
② TimeZone.getAvailableIDs() используется для получения всех часовых поясов.