【问题标题】:Refresh Text / JLabel value刷新文本/JLabel 值
【发布时间】:2015-11-22 05:52:43
【问题描述】:

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

我有两种解决方案可以在 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 循环更好。

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

  • 这些不同的解决方案有特定的用例吗?
  • 哪个更适合您的体验?
  • 在内存/电源使用方面会更好吗?
  • 这些会对性能产生什么影响?
  • 或者有没有更好的解决方案?

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

提前感谢您的所有建议

【问题讨论】:

    标签: java date time refresh jlabel


    【解决方案1】:

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

    解决方案 2 使用 awt Timer 类。它产生自己的线程,但在 AWT-EventQueue 线程上调用 actionPerformed 方法。

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

    查看有关线程的摇摆教程以获取更多信息。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

    【讨论】:

      【解决方案2】:

      到目前为止,Timer 是两者中更好的选择,但我建议您改用 SwingWorker

      在性能方面,如果你看你写的代码,你会发现定时器只每 3 秒(3000 毫秒)执行一次,而由于 while 循环,线程将连续运行而没有延迟,使得计时器要好得多,除非您确实需要不断更新标签。

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

      【讨论】:

        【解决方案3】:

        哪个更适合您的体验?

        这一切都取决于你想做什么。通常使用计时器来设置动画或运行具有特定延迟的东西就足够了。但是,如果您这样做,一切都在 EDT(事件调度线程)中运行。但是,如果您执行一个包含大量计算和图像渲染的复杂程序,它可能会减慢您的渲染速度(并且您的 JFrame 可能会变白),因为一切都在 EDT 中运行。

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

        除非您打算做一些复杂的事情,否则最简单的方法仍然是使用 Java 中的摇摆计时器。

        在内存/电源使用方面会更好吗?

        这并不重要。

        这些会对性能产生什么影响?

        在性能方面,我认为运行单独的线程似乎更好。但除非您正在做一个相对较大的项目,否则它在给定的 2 解决方案中并没有真正的不同。

        或者有没有更好的解决方案?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-03
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2013-10-12
          相关资源
          最近更新 更多