Java - 如何制作一个显示JLabel中经过时间的计时器

时间:2016-12-30 01:57:20

标签: java timer jlabel

我现在正在编写我的第一个Java游戏的代码,到目前为止我已经构建了GUI并且我想添加一些逻辑。在我的游戏中,用户应该看到他移动的时间(从10秒开始),如10,9,8,7,6,5,4,3,2,1,0。我创建了JLabel并希望显示把时间花在了它上面。我的程序有3个难度级别,首先用户通过点击适当的JButton选择一个,然后用户应该看到计时器和一些选项和播放选项。我该如何应对这个问题?我在Java中读到了Timer类,但仍然不知道如何在JLabel上显示倒计时时间。也许我应该实现一个游戏循环,但说实话,我不知道如何制作它。

1 个答案:

答案 0 :(得分:0)

你可以简单地使用倒数计时器方法并将你的JLabel传递给它,同时计算倒计时秒数和可选的“时间结束”'消息。

互联网上有很多关于此类事情的例子,但这是我的快速演绎:

public static Timer CountdownTimer(JLabel comp, int secondsDuration, String... endOfTimeMessage) {                                         
    if (secondsDuration == 0) { return null; }
    String endMsg = "~nothing~";
    if (endOfTimeMessage.length>0) { endMsg = endOfTimeMessage[0]; }
    final String eMsg = endMsg;
    int seconds = secondsDuration;
    final long duration = seconds * 1000;
    JLabel label = (JLabel)comp;
    final Timer timer = new Timer(10, new ActionListener() {
        long startTime = -1;
        @Override
        public void actionPerformed(ActionEvent event) {
            if (startTime < 0) {
                startTime = System.currentTimeMillis();
            }
            long now = System.currentTimeMillis();
            long clockTime = now - startTime;
            if (clockTime >= duration) {
                ((Timer)event.getSource()).stop();
                if (!eMsg.equals("~nothing~")) { label.setText(eMsg); }
                return;
            }
            SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS");
            label.setText(df.format(duration - clockTime));
        }
    });
    timer.start(); 
    return timer;
}

如果要更改JLabel中倒计时的显示方式,则可以更改 SimpleDateFormat 字符串。这个方法返回Timer对象,所以......你想方设法如何随时停止它(在持续时间到期之前)。