java - 从 5 到 0 的 Swing 倒计时

标签 java swing countdown

我正在创建一个 Java Swing 游戏,在每个新游戏之前,我希望显示一个帧并从 5 秒倒计时到 0 秒。

发生这种情况时,我希望后台的游戏等到倒计时完成。让游戏在后台等待的最佳方法是什么?

我试过 Thread.sleep 但这会导致事件调度线程 hibernate 并且 GUI 不更新。但是,它在我第一次运行时有效,但在第二次运行时无效。

感谢您的帮助。

public class CountdownPresenterPanel {
    JFrame mainFrame;
    int currentNumber = 5;
    JLabel textLabel;

    CountdownPresenterPanel() {
        mainFrame = new JFrame();
        textLabel = new JLabel(String.valueOf(currentNumber), SwingConstants.CENTER);
        textLabel.setFont(new Font("Arial", Font.BOLD, 55));
        textLabel.setVerticalAlignment(SwingConstants.CENTER);
        mainFrame.add(textLabel);
        mainFrame.setUndecorated(true); // Remove bar including close, minimize
        mainFrame.setSize(600,300);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
        Timer timer = new Timer(1000, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                if(currentNumber > 0) {
                    currentNumber--;
                    textLabel.setText(String.valueOf(currentNumber));
                } else {
                    mainFrame.setVisible(false);
                    mainFrame.dispose();
                }
            }
        });
        timer.setRepeats(true);
        timer.start();
    }
}

解决方案

import java.awt.*;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.Timer;

public class CountdownPresenterPanel {
    private int currentNumber = 5;
    private JLabel textLabel;
    private final JDialog dialog;
    CountdownPresenterPanel() {
        Timer timer = new Timer(1000, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                if(currentNumber > 0) {
                    currentNumber--;
                    textLabel.setText(String.valueOf(currentNumber));
                } else {
                    dialog.dispose();
                }
            }
        });
        Frame window = new Frame();
        dialog = new JDialog(window, "Alert", true);
        textLabel = new JLabel(String.valueOf(currentNumber), SwingConstants.CENTER);
        textLabel.setFont(new Font("Arial", Font.BOLD, 55)); // Increase the font-size
        dialog.add(textLabel);
        dialog.setSize(400, 200);
        dialog.setLocationRelativeTo(null);
        timer.setRepeats(true);
        timer.start();
        dialog.setUndecorated(true);
        dialog.setVisible(true);
    }
}

最佳答案

不要使用JFrame,使用某种模态对话框

看看How to Make Dialogs了解更多详情

关于java - 从 5 到 0 的 Swing 倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200634/

相关文章:

java - Java 中的多个布局管理器

java - 将 Scala 表达式转换为 Java 1.8

java - 实现平均滤波器在 OpenCV 中不起作用,但在 Java 中起作用

java - 如果用户关闭单独的窗口,为什么我的应用程序会终止?

java - JTextPane 文本在 Mac 操作系统中滚动时折叠

javascript - 倒计时器激活 Controller 方法

javascript - 按小时\分钟而不是秒计算倒计时

java - 如何在 Java 8 中实现 Elvis 运算符?

java - 单击 GUI 时数组会丢失数据

javascript - 如何设置定时器在太平洋标准时间每天中午 12 点结束?