You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JPanel上实现45秒倒计时并展示给用户?

嘿,这个需求我熟!要在JPanel上实现45秒倒计时,核心就是用Swing的Timer做定时更新,配合面板的重绘来显示剩余时间。下面是一步步的实现思路和完整代码:

实现步骤&核心要点
  • 自定义JPanel绘制倒计时:创建JPanel的子类,重写paintComponent方法来绘制当前剩余秒数。这个方法是Swing组件绘制的核心,每次调用repaint()都会触发它刷新显示。
  • 用Swing Timer做定时更新:别用Java普通的Timer,Swing组件只能在EDT(事件调度线程)里操作,而javax.swing.Timer天生适配EDT,不会有线程安全问题。它会每秒触发一次更新,我们在事件处理里减少剩余秒数,再调用repaint()刷新界面。
  • 处理倒计时结束逻辑:当剩余秒数归0时,停止Timer,还可以添加提示文字让用户明确知道时间到了。
完整代码示例
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CountdownPanel extends JPanel {
    private int remainingSeconds;
    private Timer countdownTimer;

    public CountdownPanel() {
        // 初始化倒计时为45秒
        remainingSeconds = 45;
        setPreferredSize(new Dimension(300, 200));
        setBackground(Color.WHITE);

        // 创建Timer,每秒触发一次动作事件
        countdownTimer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                remainingSeconds--;
                // 倒计时结束时停止Timer
                if (remainingSeconds <= 0) {
                    countdownTimer.stop();
                    remainingSeconds = 0;
                }
                // 触发重绘,更新显示
                repaint();
            }
        });
        // 启动倒计时
        countdownTimer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 设置醒目字体和颜色
        g.setFont(new Font("Arial", Font.BOLD, 48));
        g.setColor(Color.RED);
        // 计算文本位置,让倒计时居中显示
        String timeText = String.valueOf(remainingSeconds);
        FontMetrics metrics = g.getFontMetrics();
        int x = (getWidth() - metrics.stringWidth(timeText)) / 2;
        int y = (getHeight() - metrics.getHeight()) / 2 + metrics.getAscent();
        // 绘制倒计时数字
        g.drawString(timeText, x, y);

        // 倒计时结束时显示提示文字
        if (remainingSeconds == 0) {
            g.setFont(new Font("Arial", Font.PLAIN, 24));
            g.setColor(Color.BLUE);
            String endText = "时间到!";
            int endX = (getWidth() - metrics.stringWidth(endText)) / 2;
            int endY = y + 50;
            g.drawString(endText, endX, endY);
        }
    }

    // 可选:添加重启倒计时的方法,方便复用
    public void restartCountdown() {
        remainingSeconds = 45;
        if (!countdownTimer.isRunning()) {
            countdownTimer.start();
        }
        repaint();
    }

    public static void main(String[] args) {
        // 在EDT线程中启动GUI,避免线程安全问题
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("45秒倒计时");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new CountdownPanel());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
额外小贴士
  • 调整显示样式:如果觉得倒计时不够醒目,可以修改paintComponent里的字体(比如换更大字号、换字体)、颜色(比如剩余10秒时切换成橙色)。
  • 添加控制功能:要是需要暂停、重启倒计时,给CountdownPanel加几个方法就行,比如pauseCountdown()调用countdownTimer.stop(),resumeCountdown()调用countdownTimer.start()。
  • 自适应面板大小:代码里用FontMetrics计算文本尺寸,不管面板怎么缩放,倒计时文字都会保持居中显示。

内容的提问来源于stack exchange,提问作者Eesha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:18:03