java - JLabel 不随计时器更新

标签 java swing timer

我在互联网上进行了搜索,试图找到如何制作一个自动更新时钟 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;
    }

}

最佳答案

您正在调用 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);
}

关于java - JLabel 不随计时器更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16881338/

相关文章:

java - 将 JMenuItem 添加到已经可见的 JMenu

javascript - Ionic&AngularJS,超时未取消

java - 如何检查 JTable JAVA 中是否存在行?

c# - 如何删除 Xamarin Forms 中网格上的 TapGestureRecognizer?

android - 使用计时器进行 wifi 扫描 android 的意外结果

java - 如何使 JFileChooser 打开显示当前工作目录,无论使用什么操作系统?

Java 和 C++ 加密结果不匹配

java - dom4j cdata(保留空格)

java - 尝试从 String 转换为 Int 会导致第一个字符为 '?'

java - 使用update时Jlabel文本相乘和重叠(图形)