我是一个初学者,希望从经验丰富的程序员那里获得一些建议。

我有两种解决方案,可以在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进行编码,则这是两种解决方案。如果没有,您可以使用一些外部软件包。

10-07 13:26
查看更多