刷新文本/ JLabel值

时间:2015-08-27 17:54:34

标签: java date time refresh jlabel

我是一名初学者,正在寻找更有经验的程序员的一些建议。

我有两种解决方案可以在GUI中显示当前日期/时间,并像活动时钟一样刷新它。

解决方案1 ​​

uint64_t

解决方案2

    **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循环更好。

但你有什么经历?你会怎么做?

  • 这些不同的解决方案是否有特定用例?
  • 哪种更适合您的体验?
  • 在内存/电量使用方面会更好吗?
  • 这些对性能有何影响?
  • 或者有更好的解决方案吗?

我正在寻找有关此类功能的一般建议,不一定是时钟或日期/时间

提前感谢您的所有建议

3 个答案:

答案 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种解决方案。如果没有,您可以使用一些外部包。