[英]JLabel not updating with timer
我在整個互聯網上進行搜索,試圖找到如何制作自動更新時鍾GUI程序的過程,但是沒有運氣。 我嘗試了許多不同的方法,最終得到了相同的結果。 正如我所讀到的,我正在使用Swing Timer,這是處理gui的最佳方法。 我已經嘗試了validate(),revalidate(),repaint()。 這是代碼的一部分:
import javax.swing.*;
//import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ClockPanel extends JPanel {
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
int year = now.get(Calendar.YEAR);
private String currentTime;
private JLabel current;
public ClockPanel() {
super();
currentTime = getTime();
current = new JLabel(currentTime);
add(current);
ActionListener updater = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
getTime();
if(second == 60){
current.setText(currentTime);
revalidate();
}
getTime();
}
};
Timer timer = new Timer(1000, updater);
timer.start();
}
這是我最終得到的最終代碼; 我知道這是錯誤的,但是我已經放棄了好幾個小時才進行了很大的更改。 謝謝
編輯:這是其余的代碼
public String getTime() {
String time;
String period = "AM";
String monthName = "";
switch(month) {
case (1):
monthName = "January";
break;
case (2):
monthName = "February";
break;
case (3):
monthName = "March";
break;
case (4):
monthName = "April";
break;
case (5):
monthName = "May";
break;
case (6):
monthName = "June";
break;
case (7):
monthName = "July";
break;
case (8):
monthName = "August";
break;
case (9):
monthName = "September";
break;
case (10):
monthName = "October";
break;
case (11):
monthName = "November";
break;
case (12):
monthName = "December";
break;
}
if(hour >= 12){
period = "PM";
}
time = monthName + " " + day + ", " + year + " "
+ hourCheck(hour) + ":" + minuteCheck(minute) + period;
return time;
}
private int hourCheck(int hour) {
if(hour > 12){
hour -= 12;
return hour;
}
if(hour == 0) {
hour += 12;
return hour;
}
return hour;
}
private StringBuilder minuteCheck(int minute) {
StringBuilder time = new StringBuilder();
if(minute < 10) {
return time.append("0").append(minute);
}
else {
time.append("").append(minute);
}
return time;
}
}
您正在調用getTime()
,但忽略它返回的內容。 因此,當前時間保持不變。 將代碼替換為:
ActionListener updater = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
String newTime = getTime();
current.setText(newTime);
}
};
編輯:
您不僅會忽略getTime()
返回的值,而且getTime()
還會始終返回相同的結果,因為當面板顯示時,您總是重復使用僅初始化一次的月份,分鍾,秒數等。被建造。 通過不使用標准的DateFormat類,也使生活變得非常困難。
從面板中除去JLabel之外的所有字段,然后將getTime()
方法更改為如下所示:
private String getTime() {
// get the CURRENT date:
Date currentDate = new Date();
// format it and return it:
return new SimpleDateFormat("MMMM dd, yyyy hh:mm a").format(currentDate);
}
您可以對此進行調整,它將起作用:
public class ClockPanel extends JPanel {
private final JLabel current;
public ClockPanel() {
current = new JLabel(now());
add(current);
new Timer (1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
current.setText(now());
}
}).start();
}
private static String now() {
// implement your own
return new Date().toString();
}
public static void main(String[] args) {
JFrame main = new JFrame("Simple Clock");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setSize(200, 200);
main.setContentPane(new ClockPanel());
main.setVisible(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.