93、Java 日期时间处理与 Swing 框架入门

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 应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值