问题描述
所以我想更新程序中的时间。为此,我使用了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()));
}
}