java JLabel不使用计时器更新
我在互联网上到处搜索,试图找到如何在没有运气的情况下制作一个自动更新时钟gui程序。我尝试了很多不同的方法,结果都是一样的。正如我所读到的,我正在使用swing计时器,这是处理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;
}
}
# 1 楼答案
您正在调用
getTime()
,但忽略它返回的内容。因此,当前时间与以前一样。将代码替换为:编辑:
不仅忽略
getTime()
返回的值,而且getTime()
也总是返回相同的值,因为在构建面板时,总是重用只初始化过一次的月、分、秒等。不使用标准的DateFormat类也会让你的生活变得非常困难从面板中删除除JLabel之外的所有字段,并将
getTime()
方法更改为以下内容:# 2 楼答案
你可以调整你的代码,使之适应以下情况: