我是一名初学者,正在寻找更有经验的程序员的一些建议。
我有两种解决方案可以在GUI中显示当前日期/时间,并像活动时钟一样刷新它。
uint64_t
**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();
根据我的理解,Timer会连续运行,类似于一个线程。 并且使用事件监听器可能比使用while循环更好。
但你有什么经历?你会怎么做?
我正在寻找有关此类功能的一般建议,不一定是时钟或日期/时间
提前感谢您的所有建议
答案 0 :(得分:1)
不同之处在于代码运行的线程。 解决方案一创建自己的线程并从中更新标签。
解决方案2使用awt Timer类。它产生了它自己的线程,但在AWT-EventQueue线程上调用 actionPerformed 方法。
由于组件的所有更改都只发生在AWT-EventQueue上,这是正确的选择解决方案。
查看有关线程的swing教程以获取更多信息。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
答案 1 :(得分:1)
到目前为止,定时器是两者中较好的选择,但我建议你改用SwingWorker。
就性能而言,如果你看一下你编写的代码,你会发现计时器只每3秒(3000毫秒)执行一次,而线程会因为while循环而没有延迟地连续运行,这使得定时器要好得多,除非你真的需要不断更新标签。
但是,由于您的任务长时间运行,您应该使用SwingWorker,因为它对于与Swing GUI相关的长时间运行任务很有用。长时间运行的任务往往会锁定GUI,这显然不是很好。 SwingWorker能够在执行任务时保持GUI响应。 Here是Oracle提供的教程。
答案 2 :(得分:1)
哪种更适合您的体验?
这一切都取决于你想做什么。通常使用计时器来动画或以特定延迟运行的东西就足够了。但是,如果这样做,一切都在EDT(事件调度线程)中运行。但是如果你做了一个复杂的程序,有大量的计算和图像渲染,它可能会减慢渲染速度(并且你的JFrame可能会变成白色),因为所有东西都在EDT中运行。
或者,您可以实现自己的程序循环(或游戏循环) - 这是您的解决方案1.但是编写一个好的循环并不是直接的。它将以浪费CPU周期的速度运行。
然后,您必须调用Thread.sleep()来生成线程(暂停您的线程,以便其他线程可以运行)。您还必须控制自己的帧率。无论如何,请记住不要在EDT中运行Thread.sleep()
。
最简单的方法仍然是使用Java的swing计时器,除非你打算做一些复杂的事情。
在内存/电源使用方面要么更好吗?
它并不重要。
这些对性能有何影响?
性能方面,在我看来,运行一个单独的线程似乎更好。但除非你做的是一个相对较大的项目,否则它在给定的2解决方案中并没有真正有所作为。
或者有更好的解决方案吗?
如果您想自己使用Java编写代码,通常这些是2种解决方案。如果没有,您可以使用一些外部包。