【问题标题】:How to display Java Timer on a separate J Frame Form label?如何在单独的 J Frame Form 标签上显示 Java Timer?
【发布时间】:2012-03-15 13:48:14
【问题描述】:

我有一个问题,我在 java 中有这个计时器代码,当它执行时它会在它自己的 JFrame 标签上显示一个倒计时计时器,我想要做的是在另一个 JFrame 表单标签上显示这个计时器而不必移动代码到其他类。

我希望你们能帮我解决这个问题,谢谢大家。

这是 Timer 类的代码:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class TimerExample extends JFrame {

   final JLabel label;
   Timer countdownTimer;
   int timeRemaining = 10;

   public TimerExample() {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setSize(200, 200);
      label = new JLabel(String.valueOf(timeRemaining), JLabel.CENTER);
      getContentPane().add(label);

      countdownTimer = new Timer(1000, new CountdownTimerListener());
      setVisible(true);
      countdownTimer.start();
   }

   class CountdownTimerListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         if (--timeRemaining > 0) {
            label.setText(String.valueOf(timeRemaining));
         } else {
            label.setText("Time's up!");
            countdownTimer.stop();
         }
      }
   }

   public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            new TimerExample();
         }
      });
   }

}

谢谢

【问题讨论】:

  • 您能否详细说明您的问题?你到底想做什么,为什么?您是否有一个主窗口,希望从中启动另一个显示倒计时计时器的窗口(通常是对话框)?此外,通常在这样的情况下,您首先发布您的代码尝试解决此问题,然后显示任何错误消息或异常并描述任何行为问题。这样我们就可以准确地知道您可能做错了什么以及如何更好地帮助您。
  • 这段代码甚至无法编译;构造函数包含的代码似乎假定此类扩展JFrame,但正如所写的那样,它没有。你的问题是什么,确切地说——如何使它不依赖于JFrame?看起来你已经成功了一半。

标签: java swing oop count


【解决方案1】:

来了,

以下是我的 TestTimer 类,它接受 JLabel 作为输入

public class TestTimer {
     private JLabel label;
     Timer countdownTimer;
     int timeRemaining = 10;

     public TestTimer(JLabel passedLabel) {
        countdownTimer = new Timer(1000, new CountdownTimerListener());
        this.label = passedLabel;
        countdownTimer.start();
     }

      class CountdownTimerListener implements ActionListener {
          public void actionPerformed(ActionEvent e) {
             if (--timeRemaining > 0) {
                 label.setText(String.valueOf(timeRemaining));
              } else {
                 label.setText("Time's up!");
                 countdownTimer.stop();
              }
          }
      }
  }

这是另一个 Main 类,它实际上扩展了一个 JFrame 并在其中显示了一个标签,

public class TimerJFrame extends JFrame{    
    private static final long serialVersionUID = 1L;
    private JLabel label;

    public TimerJFrame() {
     setDefaultCloseOperation(EXIT_ON_CLOSE);
         setSize(200, 200);
         label = new JLabel("10", JLabel.CENTER);
         getContentPane().add(label);
         new TestTimer(label);
         setVisible(true);
    }

    public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            new TimerJFrame();
         }
      });
   }
}

第二个代码将创建的 JLabel 传递给第一类,第一类使用它来显示计时器。

【讨论】:

  • 非常感谢 Rahul,它帮助了很多。
  • 试过这个并将其添加到 JFrame 中。定时器不工作,数仍为 10
【解决方案2】:

您需要遵循以下步骤,

  1. 修改 TimerExample 构造函数以接受 JLabel。并用passwd JLabel初始化TimerExample类的JLabel
  2. 从其他 JFrame 类传递 JLabel。
  3. 从中删除 main 方法,因为它不是必需的。

这里是第一步,构造函数将接受来自其他类的预定义 JLabel 并使用它们来显示计时器。

【讨论】:

  • 我有一个日志窗口、一个主窗口和 TimerExample 类,当我在日志窗口上单击 Enter 时,主窗口将显示,这就是我希望计时器出现的位置
  • 我试图将主窗口中的标签设置为 = 计时器类中的标签,但它似乎在程序冻结的某个阶段不起作用:
  • 如我所说,将 JLabel 从主窗口传递给 TimerExample 类,以便 TimerExample 类更新您传递的标签。
  • 我在两个答案上都给你+1,因为上次我看到这个答案我想投票,但我去了某个地方,我错过了,现在我回到这个帖子来投票,但是看看你在另一个答案中给出的例子,我不得不对他们两个都投赞成票:-)
  • @RahulBorkar : 欢迎您并保持微笑 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多