Java JLabel不使用计时器更新
我在互联网上到处搜索,试图找到如何在没有运气的情况下制作一个自动更新时钟gui程序。我尝试了许多不同的方法,结果都是一样的。我正在使用swing定时器,正如我所读到的,这是处理gui的最好方法。我已尝试验证()、重新验证()、重新绘制()。 以下是代码的一部分:Java JLabel不使用计时器更新,java,swing,timer,Java,Swing,Timer,我在互联网上到处搜索,试图找到如何在没有运气的情况下制作一个自动更新时钟gui程序。我尝试了许多不同的方法,结果都是一样的。我正在使用swing定时器,正如我所读到的,这是处理gui的最好方法。我已尝试验证()、重新验证()、重新绘制()。 以下是代码的一部分: import javax.swing.*; //import java.awt.event.*; import java.util.*; import javax.swing.Timer; import java.awt.event.A
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(){
串时间;
字符串句点=“AM”;
字符串monthName=“”;
开关(月){
案例(1):
monthName=“一月”;
打破
案例(2):
monthName=“二月”;
打破
案例(3):
monthName=“三月”;
打破
案例(4):
monthName=“四月”;
打破
案例(5):
monthName=“May”;
打破
案例(6):
monthName=“June”;
打破
案例(7):
monthName=“七月”;
打破
案例(8):
monthName=“八月”;
打破
案件(9):
monthName=“九月”;
打破
案例(10):
monthName=“十月”;
打破
案件(11):
monthName=“11月”;
打破
案件(12):
monthName=“十二月”;
打破
}
如果(小时>=12){
period=“PM”;
}
时间=月名+“”+日+“”,“+年+“”
+hourCheck(小时)+“:“+分钟检查(分钟)+时段;
返回时间;
}
专用整数小时检查(整数小时){
如果(小时>12){
小时-=12;
返程时间;
}
如果(小时==0){
小时+=12;
返程时间;
}
返程时间;
}
私有StringBuilder minuteCheck(整数分钟){
StringBuilder时间=新建StringBuilder();
如果(分钟<10){
返回时间。追加(“0”)。追加(分钟);
}
否则{
时间。追加(“”)。追加(分钟);
}
返回时间;
}
}
您正在调用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);
}
您正在调用
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);
}
}
您可以调整代码以适应此情况,它将起作用:
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);
}
}
您的代码中有编译器错误吗。。。?你可以发布方法
getTime()
的代码吗?我在编译器中没有任何错误。如果我认为可以用“SimpleDataFormat”实例替换getTime(),那么我正在使用netbeans。为您节省了很多麻烦,而且更加灵活。您的代码中有编译器错误吗。。。?你可以发布方法getTime()
的代码吗?我在编译器中没有任何错误。如果我认为可以用“SimpleDataFormat”实例替换getTime(),那么我正在使用netbeans。省去了很多麻烦,而且更加灵活。我有一个返回时间的getTime()函数。如果你愿意,我可以发布整个代码。它可能会使它更容易,正如你所说的:它返回时间。因此,如果忽略它返回的内容,调用它不会改变任何事情。重新阅读我的答案,并尝试我发布的代码。另请参阅Genzer的示例,该示例已完成,并可执行您想要的操作。@TechnicalCustoms:阅读我编辑的答案。您的getTime()方法也是错误的。非常感谢。它起作用了。我已经找了好几个小时了,你5分钟后给我。谢谢+1我有一个返回时间的getTime()函数。如果你愿意,我可以发布整个代码。它可能会使它更容易,正如你所说的:它返回时间。因此,如果忽略它返回的内容,调用它不会改变任何事情。重新阅读我的答案,并尝试我发布的代码。另请参阅Genzer的示例,该示例已完成,并可执行您想要的操作。@TechnicalCustoms:阅读我编辑的答案。您的getTime()方法也是错误的。非常感谢。它起作用了。我已经找了好几个小时了,你5分钟后给我。感谢+1+1用于SSCCE,感谢您显示面板中的所有字段都是不必要的。+1用于SSCCE,感谢您显示面板中的所有字段都是不必要的。