Java 日期时间处理与 Swing 框架入门
一、Java 日期时间处理
1.1 DateFormat 类的使用
DateFormat
类可用于格式化日期和时间信息。以下是一个示例代码:
public class TimeFormatDemo {
public static void main(String args[]) {
Date date = new Date();
DateFormat df;
df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.JAPAN);
System.out.println("Japan: " + df.format(date));
df = DateFormat.getTimeInstance(DateFormat.LONG, Locale.UK);
System.out.println("United Kingdom: " + df.format(date));
df = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CANADA);
System.out.println("Canada: " + df.format(date));
}
}
示例输出如下:
Japan: 13:06
United Kingdom: 13:06:53 CST
Canada: 1:06:53 o’clock PM CST
DateFormat
类还有
getDateTimeInstance()
方法,可用于格式化日期和时间信息,你可以自行进行实验。
1.2 SimpleDateFormat 类
SimpleDateFormat
是
DateFormat
的具体子类,允许你定义自己的格式化模式来显示日期和时间信息。其构造函数如下:
SimpleDateFormat(String formatString)
示例代码如下:
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
格式化字符串中使用的符号决定了要显示的信息,具体符号及描述如下表所示:
| Symbol | Description |
| ---- | ---- |
| a | AM or PM |
| d | Day of month (1–31) |
| h | Hour in AM/PM (1–12) |
| k | Hour in day (1–24) |
| m | Minute in hour (0–59) |
| s | Second in minute (0–59) |
| u | Day of week, with Monday being 1 |
| w | Week of year (1–52) |
| y | Year |
| z | Time zone |
| D | Day of year (1–366) |
| E | Day of week (for example, Thursday) |
| F | Day of week in month |
| G | Era (for example, AD or BC) |
| H | Hour in day (0–23) |
| K | Hour in AM/PM (0–11) |
| L | Month |
| M | Month |
| S | Millisecond in second |
| W | Week of month (1–5) |
| X | Time zone in ISO 8601 format |
| Y | Week year |
| Z | Time zone in RFC 822 format |
以下是使用
SimpleDateFormat
类的示例代码:
import java.text.*;
import java.util.*;
public class SimpleDateFormatDemo {
public static void main(String args[]) {
Date date = new Date();
SimpleDateFormat sdf;
sdf = new SimpleDateFormat("hh:mm:ss");
System.out.println(sdf.format(date));
sdf = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(sdf.format(date));
sdf = new SimpleDateFormat("E MMM dd yyyy");
System.out.println(sdf.format(date));
}
}
示例输出如下:
01:30:51
01 Jan 2014 01:30:51 CST
Wed Jan 01 2014
1.3 JDK 8 新增的时间日期 API
JDK 8 引入了新的时间日期处理方式,相关的包如下:
| Package | Description |
| ---- | ---- |
| java.time | Provides top-level classes that support time and date. |
| java.time.chrono | Supports alternative, non-Gregorian calendars. |
| java.time.format | Supports time and date formatting. |
| java.time.temporal | Supports extended date and time functionality. |
| java.time.zone | Supports time zones. |
1.3.1 时间日期基础类
java.time
包中定义了几个顶级类,如
LocalDate
、
LocalTime
和
LocalDateTime
,它们分别封装了本地日期、时间以及日期和时间。这些类没有公共构造函数,可使用工厂方法
now()
来获取当前日期和时间。示例代码如下:
import java.time.*;
class DateTimeDemo {
public static void main(String args[]) {
LocalDate curDate = LocalDate.now();
System.out.println(curDate);
LocalTime curTime = LocalTime.now();
System.out.println(curTime);
}
}
示例输出如下:
2014-01-01
14:03:41.436
也可以使用
LocalDateTime
类来同时获取日期和时间:
LocalDateTime curDateTime = LocalDateTime.now();
System.out.println(curDateTime);
示例输出如下:
2014-01-01T14:04:56.799
还可以通过
toLocalDate()
和
toLocalTime()
方法从
LocalDateTime
实例中获取日期或时间组件:
LocalDate toLocalDate();
LocalTime toLocalTime();
1.4 日期时间格式化
LocalDate
、
LocalTime
和
LocalDateTime
类都提供了
format()
方法来指定日期和时间的格式:
String format(DateTimeFormatter fmtr)
DateTimeFormatter
类位于
java.time.format
包中,可使用其工厂方法来获取实例,例如:
static DateTimeFormatter ofLocalizedDate(FormatStyle fmtDate);
static DateTimeFormatter ofLocalizedTime(FormatStyle fmtTime);
static DateTimeFormatter ofLocalizedDateTime(FormatStyle fmtDate, FormatStyle fmtTime);
FormatStyle
是一个枚举,定义了以下常量:
- FULL
- LONG
- MEDIUM
- SHORT
以下是使用
DateTimeFormatter
显示当前日期和时间的示例代码:
import java.time.*;
import java.time.format.*;
class DateTimeDemo2 {
public static void main(String args[]) {
LocalDate curDate = LocalDate.now();
System.out.println(curDate.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)));
LocalTime curTime = LocalTime.now();
System.out.println(curTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)));
}
}
示例输出如下:
Wednesday, January 1, 2014
2:16 PM
还可以使用
ofPattern()
方法创建自定义格式:
static DateTimeFormatter ofPattern(String fmtPattern);
示例代码如下:
import java.time.*;
import java.time.format.*;
class DateTimeDemo3 {
public static void main(String args[]) {
LocalDateTime curDateTime = LocalDateTime.now();
System.out.println(curDateTime.format(DateTimeFormatter.ofPattern("MMMM d',' yyyy h':'mm a")));
}
}
示例输出如下:
January 1, 2014 2:22 PM
1.5 日期时间字符串解析
LocalDate
、
LocalTime
和
LocalDateTime
类提供了
parse()
方法来解析日期和时间字符串,有两种形式:
- 第一种使用默认格式化器解析标准 ISO 格式的日期和时间:
static LocalDateTime parse(CharSequence dateTimeStr);
- 第二种允许指定自己的格式化器:
static LocalDateTime parse(CharSequence dateTimeStr, DateTimeFormatter dateTimeFmtr);
以下是使用自定义格式化器解析日期和时间字符串的示例代码:
import java.time.*;
import java.time.format.*;
class DateTimeDemo4 {
public static void main(String args[]) {
LocalDateTime curDateTime = LocalDateTime.parse("June 21, 2014 12:01 AM", DateTimeFormatter.ofPattern("MMMM d',' yyyy hh':'mm a"));
System.out.println(curDateTime.format(DateTimeFormatter.ofPattern("MMMM d',' yyyy h':'mm a")));
}
}
示例输出如下:
June 21, 2014 12:01 AM
1.6 java.time 包其他值得探索的内容
java.time
包中还有其他一些类值得探索,如
Instant
、
Duration
和
Period
。
Instant
封装了一个时间点,
Duration
封装了一段时间长度,
Period
封装了一个日期长度。可以通过查看
LocalDate
、
LocalTime
和
LocalDateTime
类的方法,来进行日期和时间的加减、调整、比较等操作。
二、Swing 框架入门
2.1 Swing 简介
Swing 是一个框架,提供了比 AWT 更强大、更灵活的 GUI 组件,已被 Java 程序员广泛使用了十多年。
2.2 Swing 的起源
Swing 是为了解决 Java 原始 GUI 子系统(Abstract Window Toolkit,AWT)的不足而产生的。AWT 将各种视觉组件转换为相应的平台特定等效物,其组件外观和感觉由平台定义,使用本地代码资源,被称为重量级组件。这种方式导致了一些问题:
- 不同操作系统上组件的外观和行为可能不同,威胁到 Java 的“一次编写,到处运行”的理念。
- 组件的外观和感觉是固定的,难以更改。
- 重量级组件存在一些限制,例如总是不透明的。
1997 年,Swing 作为 Java Foundation Classes(JFC)的一部分被引入,从 Java 1.2 开始,Swing 被完全集成到 Java 中。
2.3 Swing 基于 AWT
虽然 Swing 消除了 AWT 的一些限制,但它并没有取代 AWT,而是建立在 AWT 的基础上。Swing 使用与 AWT 相同的事件处理机制,因此使用 Swing 需要对 AWT 和事件处理有基本的了解。
2.4 Swing 的两个关键特性
2.4.1 轻量级组件
除极少数例外,Swing 组件是轻量级的,它们完全用 Java 编写,不直接映射到平台特定的对等物。轻量级组件更高效、更灵活,其外观和感觉由 Swing 决定,而不是底层操作系统,因此在所有平台上的工作方式一致。
2.4.2 可插拔的外观和感觉
Swing 支持可插拔的外观和感觉(PLAF)。由于每个 Swing 组件由 Java 代码渲染,而不是由本地对等物渲染,因此组件的外观和感觉由 Swing 控制。这使得可以将组件的外观和感觉与组件的逻辑分离,从而可以在不影响使用该组件的代码的其他方面的情况下更改组件的渲染方式。可以为任何给定组件“插入”新的外观和感觉,甚至可以定义整个应用程序的外观和感觉。
2.5 Swing 程序的一般形式
Swing 程序包括应用程序和小程序,后续会详细介绍常见的 Swing 组件和基于 Swing 的菜单。虽然 Swing 包中的类和接口数量很多,无法全面覆盖,但通过学习可以对这个重要的主题有基本的了解。
总结
本文介绍了 Java 日期时间处理的相关知识,包括
DateFormat
、
SimpleDateFormat
类的使用,JDK 8 新增的时间日期 API,以及日期时间的格式化和解析。同时,还介绍了 Swing 框架的起源、基于 AWT 的特点以及两个关键特性。掌握这些知识可以帮助你更好地处理 Java 中的日期时间和创建 GUI 应用程序。
2.6 Swing 程序示例:简单应用程序
下面是一个简单的 Swing 应用程序示例,用于创建一个包含标签的窗口:
import javax.swing.*;
import java.awt.*;
public class SimpleSwingApp {
public static void main(String[] args) {
// 创建 JFrame 窗口
JFrame frame = new JFrame("Simple Swing Application");
// 设置关闭窗口时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口大小
frame.setSize(300, 200);
// 创建 JLabel 标签
JLabel label = new JLabel("Hello, Swing!");
// 设置标签的对齐方式
label.setHorizontalAlignment(JLabel.CENTER);
// 将标签添加到窗口的内容面板中
frame.getContentPane().add(label, BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
}
}
这个示例的操作步骤如下:
1.
创建
JFrame
窗口
:
JFrame
是 Swing 中用于创建窗口的类,通过构造函数传入窗口标题。
2.
设置关闭操作
:使用
setDefaultCloseOperation
方法设置窗口关闭时的操作,这里选择
JFrame.EXIT_ON_CLOSE
表示关闭窗口时退出程序。
3.
设置窗口大小
:使用
setSize
方法设置窗口的宽度和高度。
4.
创建
JLabel
标签
:
JLabel
用于显示文本或图像,这里创建一个显示“Hello, Swing!”的标签。
5.
设置标签对齐方式
:使用
setHorizontalAlignment
方法将标签内容水平居中显示。
6.
添加标签到窗口
:通过
getContentPane().add
方法将标签添加到窗口的内容面板中,并指定布局方式为
BorderLayout.CENTER
。
7.
显示窗口
:使用
setVisible
方法将窗口设置为可见。
2.7 Swing 中的绘画
在 Swing 中,绘画是通过重写
JComponent
类的
paintComponent
方法来实现的。以下是一个简单的绘画示例:
import javax.swing.*;
import java.awt.*;
class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 设置画笔颜色为红色
g.setColor(Color.RED);
// 绘制一个矩形
g.drawRect(50, 50, 100, 100);
// 设置画笔颜色为蓝色
g.setColor(Color.BLUE);
// 绘制一个填充的椭圆
g.fillOval(200, 50, 100, 100);
}
}
public class PaintingExample {
public static void main(String[] args) {
// 创建 JFrame 窗口
JFrame frame = new JFrame("Painting Example");
// 设置关闭窗口时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口大小
frame.setSize(400, 300);
// 创建自定义面板
MyPanel panel = new MyPanel();
// 将面板添加到窗口的内容面板中
frame.getContentPane().add(panel);
// 显示窗口
frame.setVisible(true);
}
}
这个示例的操作步骤如下:
1.
创建自定义面板类
:创建一个继承自
JPanel
的类
MyPanel
,并重写
paintComponent
方法。
2.
重写
paintComponent
方法
:在方法内部,首先调用父类的
paintComponent
方法,然后使用
Graphics
对象进行绘画操作。这里先设置画笔颜色为红色,绘制一个矩形,再设置画笔颜色为蓝色,绘制一个填充的椭圆。
3.
创建
JFrame
窗口
:创建一个
JFrame
窗口,并设置标题、关闭操作和大小。
4.
创建自定义面板实例
:创建
MyPanel
类的实例。
5.
将面板添加到窗口
:将自定义面板添加到窗口的内容面板中。
6.
显示窗口
:将窗口设置为可见。
2.8 常见 Swing 组件
常见的 Swing 组件包括按钮、文本框、下拉列表等,下面简单介绍一些常见组件的使用。
2.8.1 按钮(
JButton
)
import javax.swing.*;
import java.awt.*;
public class JButtonExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JButton Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JButton button = new JButton("Click me");
frame.getContentPane().add(button, BorderLayout.CENTER);
frame.setVisible(true);
}
}
操作步骤:
1. 创建
JFrame
窗口并设置相关属性。
2. 创建
JButton
实例并设置按钮文本。
3. 将按钮添加到窗口的内容面板中。
4. 显示窗口。
2.8.2 文本框(
JTextField
)
import javax.swing.*;
import java.awt.*;
public class JTextFieldExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JTextField Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JTextField textField = new JTextField(20);
frame.getContentPane().add(textField, BorderLayout.CENTER);
frame.setVisible(true);
}
}
操作步骤:
1. 创建
JFrame
窗口并设置相关属性。
2. 创建
JTextField
实例并指定列数。
3. 将文本框添加到窗口的内容面板中。
4. 显示窗口。
2.8.3 下拉列表(
JComboBox
)
import javax.swing.*;
import java.awt.*;
public class JComboBoxExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JComboBox Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
String[] items = {"Item 1", "Item 2", "Item 3"};
JComboBox<String> comboBox = new JComboBox<>(items);
frame.getContentPane().add(comboBox, BorderLayout.CENTER);
frame.setVisible(true);
}
}
操作步骤:
1. 创建
JFrame
窗口并设置相关属性。
2. 创建一个字符串数组作为下拉列表的选项。
3. 创建
JComboBox
实例并传入选项数组。
4. 将下拉列表添加到窗口的内容面板中。
5. 显示窗口。
2.9 Swing 菜单
Swing 提供了创建菜单的功能,下面是一个简单的菜单示例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SwingMenuExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Swing Menu Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建菜单栏
JMenuBar menuBar = new JMenuBar();
// 创建文件菜单
JMenu fileMenu = new JMenu("File");
// 创建菜单项
JMenuItem openMenuItem = new JMenuItem("Open");
JMenuItem exitMenuItem = new JMenuItem("Exit");
// 为退出菜单项添加事件监听器
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// 将菜单项添加到文件菜单中
fileMenu.add(openMenuItem);
fileMenu.add(exitMenuItem);
// 将文件菜单添加到菜单栏中
menuBar.add(fileMenu);
// 将菜单栏设置到窗口中
frame.setJMenuBar(menuBar);
frame.setVisible(true);
}
}
操作步骤:
1. 创建
JFrame
窗口并设置相关属性。
2. 创建
JMenuBar
菜单栏。
3. 创建
JMenu
菜单,这里创建一个名为“File”的文件菜单。
4. 创建
JMenuItem
菜单项,这里创建“Open”和“Exit”两个菜单项。
5. 为“Exit”菜单项添加事件监听器,当点击该菜单项时退出程序。
6. 将菜单项添加到菜单中。
7. 将菜单添加到菜单栏中。
8. 将菜单栏设置到窗口中。
9. 显示窗口。
总结
本文深入介绍了 Java 日期时间处理和 Swing 框架的相关知识。在日期时间处理方面,涵盖了传统的
DateFormat
和
SimpleDateFormat
类,以及 JDK 8 新增的时间日期 API,包括日期时间的获取、格式化和解析等操作。在 Swing 框架方面,介绍了其起源、基于 AWT 的特点、关键特性,还给出了 Swing 程序的示例,包括简单应用程序、绘画、常见组件和菜单的使用。掌握这些知识,能够帮助开发者更好地处理 Java 中的日期时间问题,以及创建出功能丰富、界面友好的 GUI 应用程序。
超级会员免费看
2256

被折叠的 条评论
为什么被折叠?



