JLabel中的更新时间?

问题描述

所以我想更新程序中的时间。为此,我使用了JLabel。所以当我把text.setText(“ Example”); JLabel不更新吗?任何想法为什么? (我只包含了代码的每个重要部分,没有出现任何语法错误

    public JLabel timeNow;
    public static Date dt = new Date(); // current time
    public static int month = dt.getMonth(); // gets the current month
    public static int hours = dt.getHours(); // gets hour of day
    public static int minute = dt.getMinutes();
    public static int second = dt.getSeconds();

public static void main(String[] args) {
        GUI g = new GUI(); //GUI is the name of the class
    g.Update();
    }

public void Update() {
        while(1 == 1) {
            hours = dt.getHours();
            minute = dt.getMinutes();
            second = dt.getSeconds();
            String timeText = "Aktuelle Zeit: " + hours + ":" + minute + ":" + second;
            timeNow.setText(timeText);
        }
    }

解决方法

对UI的更新应该在EventDispatch线程上进行,以实现将timeNow.setText(timeText)替换为

SwingUtilities.invokeLater(
    new Runnable()
    {
        public void run()
        {
            timeNow.setText(timeText);
        }
    });

正如@BeUndead在评论中说的那样,您不是在更新dt对象,因此这样做仍只会写原始日期时间,还需要获取一个新的日期时间。

更好的方法是使用Timer对象,该对象创建一个事件,您可以在其中更新UI。

,

要在Swing中更新GUI,您应该在EventDispatch线程中进行:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class GUI extends JFrame implements ActionListener {

    private final JLabel timeLabel = new JLabel();
    private final DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

    public GUI() {
        setLayout(new BorderLayout());
        add(timeLabel,BorderLayout.CENTER);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(300,100);
        new Timer(500,this).start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GUI().setVisible(true));
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        timeLabel.setText(df.format(new Date()));
    }
}