在Java中为标签设置计时器

时间:2015-04-26 15:03:01

标签: java timer timertask

目前,我正在开发ATM模拟,主要有三种功能,即“显示余额”,“取款”和“存款”。由于它只是一个模拟,没有自动提款机,因此我在客户想要存入账户时分配了一笔随机金额。

说到我的问题,当用户点击存款时,该屏幕上有一个标签。我希望该标签写入“数钱”2秒,然后显示实际数量,这是随机生成的。

我的问题是第一部分。如何让标签写入“计数”2秒钟?

感谢您的回答和时间。

4 个答案:

答案 0 :(得分:4)

Swing为此类事件提供了timer,请查看documentation。例如:

label.setText("Counting");
Timer timer = new Timer(2000, e -> label.setText("Done"));
timer.setRepeats(false);
timer.start();

作为一名评论者指出它是javax.swing.Timer而不是java.util.Timer,因为前者在EDT上执行它的行动。

答案 1 :(得分:1)

假设您已经创建了一个选择窗格(JPanel,JDesktopPane等)并为Deposit按钮创建了类似的JButton,并为要显示的标签创建了JLabel" Counting Money",您需要创建一个Thread,它将与您程序中的其他代码并行运行,这样您的程序就不必等待计数过程,直到您可以执行其他操作。因此,您将创建一个Thread对象,如下所示,并使用代码Calendar.getInstance().getTimeInMillis()获取当前时间并设置long变量以保存开始时间。然后使用while循环,您将继续检查开始时间和当前时间之间的差异,以查看是否已经过了2秒。将此差异保存在循环内的另一个long变量中,并使循环检查其值是否超过2000毫秒(2秒)。当while循环超过2秒时,Thread可以继续执行下一行代码,将标签设置为空(您可以将文本更改为您想要的任何内容)。在此之后Thread停止。您的代码应如下所示:

    JLabel lblCount = new JLabel("");
    lblCount.setBounds(92, 28, 243, 90);
    windowPane.add(lblClock);

    JButton btnDeposit = new JButton("Deposit Money");
    btnDeposit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            lblCount.setText("Counting Money.....Please Wait");
            long start = Calendar.getInstance().getTimeInMillis();
            Thread timer = new Thread(){
                public void run()
                { 
                    long time = Long.valueOf(0);
                     while(time < Long.valueOf(2))
                     {
                         time = (Calendar.getInstance().getTimeInMillis() - start)/1000;
                     }

                     lblCount.setText("");
                }
            };
        }
    });
    btnDeposit.setBounds(78, 175, 118, 53);
    windowPane.add(btnDeposit);

答案 2 :(得分:0)

public void crono() {
    TimerTask tarea = new TimerTask() {

        @Override
        public void run() {
            int ok = 0;
            if (actualTime < maxTime * 1000) {
                ok = 1;
                //because its in miliseconds
                actualTime = actualTime + 1000;
            }

            switch (ok) {
                case 1:
                    int displayTime= actualTime/ 1000;
                    label.setText(Integer.toString(displayTime));
                    break;
                //if actual is over maxtime
                case 0:
                    label.setText("TIME IS UP");
                    break;
                default:
                    break;
            }

        }

    };
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(tarea, 0, 1000);

//the first argument will be the task, the second the starting time, and the final one is //the period, in this case it will be one second



}

答案 3 :(得分:-1)

尝试使用线程。

Thread t; 
t = new Thread(){
  @Override
  public void run(){
    label.setText("counting...");
    Thread.sleep(2000);//Time in Milliseconds
    label.setText("Display what you want.");
  }
}
t.start();