前言
本文主要介绍如何使用 Java Swing 实现一个简易的动态时钟。
开发环境
- JDK 版本随意
开始
Swing 简介
Swing 是 Java 的一个 GUI 工具包,它提供了一套丰富的组件,用于开发图形用户界面(GUI)应用程序,这些组件既可用于 Java 应用程序,也可用于 Applet。
Swing 组件
JFrame 是一个顶层容器,它包含并管理其他 Swing 组件。Component 是所有 Swing 组件的超类。我们将使用 JFrame 和 JPanel 来创建一个简单的窗口。添加我们自定义的组件到 JFrame 中。
自定义的组件 ClockPanel 的实现
private static class ClockPanel extends Component {
private static final SimpleDateFormat DATE_FORMAT;
private static final SimpleDateFormat TIME_FORMAT;
static {
DATE_FORMAT = new SimpleDateFormat("yyyy'年'MM'月'dd'日'");
TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 30));
g.drawString(DATE_FORMAT.format(Calendar.getInstance().getTime()), 20, 100);
g.drawString(TIME_FORMAT.format(Calendar.getInstance().getTime()), 20, 140);
}
}
获取时间需要用到 Calender 类,再使用 SimpleDateFormat 类去对我们的日期进行自定义的格式化。
另附源码
import javax.swing.*;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* Package: cn.stazxr
* 动态时钟
*
* @Author: stazxr
* @Create: 2023/12/12
* @Version: v1.0
**/
public class DynamicClock {
// 标识位
private static boolean flag = true;
public static void main(String[] args) {
JFrame frame = new JFrame("动态时钟 作者:stazxr.cn");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(new Dimension(350, 230));
frame.setLocationRelativeTo(null);
JPanel panel = new JPanel() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("当前时间:", 10, 50);
}
};
panel.setBackground(Color.BLACK);
panel.setBounds(0, 0, 350, 60);
frame.add(panel);
ClockPanel comp = new ClockPanel();
comp.setBounds(0, 60, 350, 140);
frame.add(comp);
frame.setVisible(true);
Thread thread = new Thread(() -> {
while (flag) {
comp.repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
frame.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
// 结束线程
flag = false;
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
thread.interrupt();
}
});
thread.start();
while (!thread.isInterrupted()) {
Thread.yield();
}
System.out.println("exited");
}
private static class ClockPanel extends Component {
private static final SimpleDateFormat DATE_FORMAT;
private static final SimpleDateFormat TIME_FORMAT;
static {
DATE_FORMAT = new SimpleDateFormat("yyyy'年'MM'月'dd'日'");
TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD, 30));
g.drawString(DATE_FORMAT.format(Calendar.getInstance().getTime()), 20, 100);
g.drawString(TIME_FORMAT.format(Calendar.getInstance().getTime()), 20, 140);
}
}
}
效果展示:
END