Java 刷新文本/JLabel值

Java 刷新文本/JLabel值,java,date,time,refresh,jlabel,Java,Date,Time,Refresh,Jlabel,我是一个初学者,从经验丰富的程序员那里寻求一些建议 我有两种解决方案可以在GUI中显示当前日期/时间,并像实时时钟一样刷新它 解决方案1 解决方案2 问题: 据我所知,计时器将连续运行,类似于线程。 在性能方面,使用事件侦听器可能比使用while循环要好 但你的经历是什么?你会怎么做 这些不同的解决方案是否有特定的用例 哪一个更适合你的经验 在内存/电源使用方面,两者都会更好吗 这些对性能有什么影响 还是有更好的解决办法 我正在寻找关于这类功能的一般建议,不一定是时钟或日期/时间 提前感谢您

我是一个初学者,从经验丰富的程序员那里寻求一些建议

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

解决方案1 解决方案2 问题: 据我所知,计时器将连续运行,类似于线程。 在性能方面,使用事件侦听器可能比使用while循环要好

但你的经历是什么?你会怎么做

  • 这些不同的解决方案是否有特定的用例
  • 哪一个更适合你的经验
  • 在内存/电源使用方面,两者都会更好吗
  • 这些对性能有什么影响
  • 还是有更好的解决办法
我正在寻找关于这类功能的一般建议,不一定是时钟或日期/时间


提前感谢您的所有建议

不同之处在于代码运行的线程不同。 解决方案一创建自己的线程并从中更新标签

解决方案2使用awt定时器类。它生成自己的线程,但在AWT EventQueue线程上调用了actionPerformed方法

由于对组件的所有更改只应发生在AWT EventQueue上,因此选择正确的解决方案


有关更多信息,请参阅关于线程的swing教程

计时器是这两个选项中最好的一个,但是我建议您使用一个

在性能方面,如果您查看您编写的代码,您将看到计时器仅每3秒(3000毫秒)执行一次,而线程将连续运行,不会因while循环而延迟,这使计时器变得更好,除非您确实需要不断更新标签

但是,由于您的任务是长时间运行的,您可能应该使用,因为它对于与Swing GUI相关的长时间运行的任务很有用。长时间运行的任务往往会锁定GUI,这显然是不好的。SwingWorker能够在执行任务时保持GUI的响应性。是Oracle提供的教程

哪一个更适合你的经验

这完全取决于你想做什么。一般来说,使用计时器来设置动画或以特定的延迟运行东西就足够了。但是,如果执行此操作,所有内容都将在EDT(事件调度线程)中运行。但是,如果您使用大量计算和图像渲染的复杂程序,则可能会减慢渲染速度(并且JFrame可能会变为白色),因为所有内容都在EDT中运行

或者,您可以实现自己的程序循环(或游戏循环)——这是您的解决方案1。但是写一个好的循环并不是那么简单。它将以尽可能快的速度运行,从而浪费CPU周期。 然后,您必须调用Thread.sleep()来生成该线程(暂停您的线程,以便其他线程可以运行)。您还必须自己控制帧速率。无论如何,记住不要在EDT中运行
Thread.sleep()

最简单的方法仍然是使用Java中的swing计时器,除非您计划做一些复杂的事情

在内存/电源使用方面,两者都会更好吗

这并不重要

这些对性能有什么影响

就性能而言,在我看来,运行单独的线程似乎更好。但是,除非你正在做一个相对较大的项目,否则它在给定的2解决方案中并没有真正的区别

还是有更好的解决办法

如果您想自己用Java编写代码,通常有两种解决方案。如果没有,您可以使用一些外部软件包

    **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 timer = new Timer(3000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Date date = new Date();
            label.setText(dateFormat.format(date));
        }
    });
    timer.start();