【问题标题】:JLabel not updating with timerJLabel 不使用计时器更新
【发布时间】:2013-06-02 09:08:46
【问题描述】:

我在整个互联网上搜索,试图找到如何制作一个自动更新时钟 gui 程序,但没有运气。我尝试了许多不同的方法,以相同的结果结束。我正在使用摇摆计时器,因为我已经读过这是处理 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()方法的代码贴出来吗?
  • 编译器内部没有任何错误。如果有帮助,我正在使用 netbeans
  • 我认为您可以将 getTime() 替换为“SimpleDateFormat”实例。为您省去了很多麻烦,而且更加灵活。

标签: java swing timer


【解决方案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);
}

【讨论】:

  • 我有一个返回时间的 getTime() 函数。如果您愿意,我可以发布整个代码。它可能会更容易
  • 如您所说:它返回时间。因此,如果您忽略它返回的内容,调用它不会改变任何内容。重新阅读我的答案,并尝试我发布的代码。另请参阅 Genzer 的示例,它是完整的并且可以满足您的需求。
  • @TechnicalCustoms:阅读我编辑的答案。你的 getTime() 方法也是错误的。
  • 非常感谢。有用。我已经搜索了几个小时,你在 5 分钟内给出了它。谢谢+1
【解决方案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);
    }
}

【讨论】:

  • +1 表示 SSCCE,并表明面板中的所有这些字段都是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多