이 기사에 설명된 예제는 인터페이스에서 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 기반 인터페이스에서 시간을 동적으로 표시합니다. * */public class TimeFrame은 JFrame을 확장합니다. mm:ss"; private String time; private int ONE_SECOND = 1000; public TimeFrame() { timePanel = new JPanel(); timeLabel = new JLabel("CurrentTime: "); displayArea = new JLabel(); timePanel.add(timeLabel); this.setDefaultCloseOperation (EXIT_ON_CLOSE); this.setSize(new Dimension(200,70)); this.setLocationRelativeTo(null) } /** * 이 메소드는 초당 시간을 업데이트하는 타이머 작업을 생성합니다. */ private void configTimeArea() { Timer tmr = new Timer()(new JLabelTimerTask(),new Date(), ONE_SECOND) } /** * 시간 표시 영역을 업데이트하는 타이머 작업 * */ protected 클래스 JLabelTimerTask는 TimerTask를 확장합니다{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = dateFormatter.format(Calendar.getInstance().getTime()) public static void main(String arg[]) { TimeFrame timeFrame=new TimeFrame(); timeFrame.setVisible(true) } }
TimerTask를 상속하여 사용자 지정 작업을 만들고, 현재 시간을 가져오고, displayArea를 업데이트합니다.
그런 다음 타이머 인스턴스를 생성하고 1초마다 타이머태스크를 실행합니다. Schedule 사용시 시간오차가 발생할 수 있으므로 정확도가 높은 ScheduleAtFixedRate를 직접 호출한다.
2. 방법 2: 스레드 사용:
이것은 비교적 간단합니다. 구체적인 코드는 다음과 같습니다.
import java.awt.Dimension;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * 이 클래스는 * JSwing 기반 인터페이스에서 시간을 동적으로 표시하는 방법을 설명하는 간단한 JFrame 구현 * @author Edison * */public class DTimeFrame2는 JFrame을 확장합니다. Runnable 구현{ private JPanel timePanel; private JLabel displayArea; private String DEFAULT_TIME_FORMAT = "HH:mm:ss"; public DTimeFrame2() { timePanel = new JPanel(); = new JLabel("현재 시간: "); JLabel(); timePanel.add(displayArea); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLocationRelativeTo(null) ); } 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("Error!!! "); } } } public static void main(String arg[]) { DTimeFrame2 df2=new DTimeFrame2(); df2.setVisible(true); 스레드 thread1=new Thread(df2) } }
비교하다:
개인적으로 저는 Timer를 여러 TimerTask에서 공유할 수 있고 스레드를 생성하면 다중 스레드의 유지 관리 복잡성이 증가하기 때문에 첫 번째 방법을 선호합니다.
다음 코드에 주의하세요.
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 = 개인 문자열 시간; 개인 TimeZone timeZone; 개인 JLabel displayArea; 개인 문자열 DEFAULT_FORMAT = "EEE d MMM, HH:mm:ss"; JComboBox(); timePanel = new JPanel(); timeZone = TimeZone.getDefault(); zoneBox.setModel(new DefaultComboBoxModel(TimeZone.getAvailableIDs())); @Override public void actionPerformed(ActionEvent e) { updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem())); } }); timePanel.add(displayArea); this.add(zoneBox, BorderLayout. NORTH); this.add(timePanel, BorderLayout.CENTER); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); pack() } /** * 이 메소드는 초당 시간을 업데이트하는 타이머 작업을 생성합니다. */ private void configTimeArea() 타이머 tmr = new Timer(); tmr.scheduleAtFixedRate(new) JLabelTimerTask(),new Date(), ONE_SECOND) } /** * 시간 표시 영역을 업데이트하는 타이머 작업 * */ public class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH); 무효 실행() { dateFormatter.setTimeZone(timeZone) 시간 = dateFormatter.format(Calendar.getInstance().getTime()); displayArea.setText(time); } } /** * timeZone 업데이트 * @param newZone */ public void updateTimeZone(TimeZone newZone) { this.timeZone = newZone ; } 공개 정적 void main(String arg[]) { new WorldTimeFrame() } }
원래는 updateTimeZone(TimeZone newZone)에서 displayArea를 업데이트해야 합니다. 하지만 TimerTask의 실행 시간이 육안으로 보기에는 1초 정도로 너무 짧다는 점을 고려하면 기본적으로는 즉시 업데이트하는 것과 같습니다. TimerTask의 실행 시간이 길면 displayArea를 즉시 주의 깊게 업데이트해야 합니다.
다시 채우다:
①.pack()은 화면 크기를 자동으로 계산하는 데 사용됩니다.
② TimeZone.getAvailableIDs()는 모든 TimeZone을 얻기 위해 사용됩니다.