有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
    }

}

共 (2) 个答案

  1. # 1 楼答案

    您正在调用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);
    }
    
  2. # 2 楼答案

    你可以调整你的代码,使之适应以下情况:

    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);
        }
    }