我是一个初学者,希望从经验丰富的程序员那里获得一些建议。
我有两种解决方案,可以在GUI中显示当前日期/时间,并像实时时钟一样刷新它。
解决方案1
**DateFormat** dateFormat = new SimpleDateFormat("dd MMMM yyyy - HH:mm:ss z");
JLabel dateTimeLabel = new JLabel();
add(dateTimeLabel, BorderLayout.CENTER);
new Thread() {
public void run() {
while (true) {
Date curEngDate = new Date();
dateTimeLabel.setText(dateFormat.format(curEngDate));
}
}
}.start();
解决方案2
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Date date = new Date();
label.setText(dateFormat.format(date));
}
});
timer.start();
问题:
据我了解,Timer会像线程一样连续运行。
并且使用事件监听器可能比使用while循环提高性能。
但是你有什么经验呢?你会怎么做?
这些不同的解决方案是否有特定的用例?
哪个更适合您的体验?
在内存/电源使用方面会更好吗?
这些将对性能产生什么影响?
还是有更好的解决方案?
我正在寻找有关此类功能的一般建议,而不必针对时钟或日期/时间
预先感谢您的所有建议
最佳答案
哪个更适合您的体验?
这完全取决于您要做什么。通常,使用计时器动画或以特定的延迟运行事物就足够了。但是,如果执行此操作,则所有内容都将在EDT(事件调度线程)中运行。但是,如果您使用大量的计算和图像渲染来编写复杂的程序,则可能会减慢渲染速度(并且JFrame可能会变白),因为一切都在EDT中运行。
或者,您可以实现自己的程序循环(或游戏循环),这是您的解决方案1.但是编写一个好的循环并不是那么简单。它会以尽可能浪费CPU周期的速度运行。
然后,您将必须调用Thread.sleep()来产生线程(暂停线程,以便其他线程可以运行)。您还必须控制自己的帧速率。无论如何,请记住不要在EDT中运行Thread.sleep()
。
除非您打算做一些复杂的事情,否则最简单的方法仍然是使用Java中的摆动计时器。
在内存/电源使用方面会更好吗?
没关系。
这些将对性能产生什么影响?
在性能方面,我认为运行单独的线程似乎更好。但是,除非您正在做一个相对较大的项目,否则在给定的2个解决方案中并没有真正的区别。
还是有更好的解决方案?
通常,如果您想自己使用Java进行编码,则这是两种解决方案。如果没有,您可以使用一些外部软件包。