簡體   English   中英

JLabel不使用計時器更新

[英]JLabel not updating with timer

我在整個互聯網上進行搜索,試圖找到如何制作自動更新時鍾GUI程序的過程,但是沒有運氣。 我嘗試了許多不同的方法,最終得到了相同的結果。 正如我所讀到的,我正在使用Swing Timer,這是處理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);
}

您可以對此進行調整,它將起作用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM