六、常用API ★ ✔

六、常用API

  • 模块14.基础API
  • 第一章.String
    • 1.String介绍
    • 2.String的实现原理 ★
    • 3.String的创建 (无参、字符串、字符数组、字节数组)
    • 4.String 面试题【String s = new String("abc")】
    • 5.字符串常见问题
  • 第二章.String的方法
    • 1.判断方法(equals equalsIgnoreCase)
      • 2.练习1
    • 3.获取功能(length()、concat、charAt、indoxOf、subString)
      • 4.练习2
    • 5.转换功能(toCharArray、getBytes、replace)
      • 7.练习4
    • 8.分割功能(split)
  • 第三章.其他方法
        • contains、endsWith、startWith、toLowerCase、toUpperCase、trim
  • 第四章.StringBuilder类
    • 1.StringBuilder的介绍
    • 2.StringBuilder的使用
        • append、reverse、toString
    • 3.练习
  • 模块15.常用API
  • 第一章.Math类
    • 1.Math类介绍
    • 2.Math类方法
      • abs、ceil、floor、round、max、min
  • 第二章.BigInteger
    • 1.BigInteger介绍
      • add、subtract、multiply、divide
    • 2.BigInteger使用
  • 第三章.BigDecimal类
    • 1.BigDecimal介绍
    • 2.BigDecimal使用
    • 3.BigDecimal除法过时方法解决
  • 第四章.Date日期类
    • 1.Date类的介绍
    • 2.Date类的使用
    • 3.Date类的常用方法
  • 第五章.Calendar日历类
    • 1.Calendar介绍
  • 第六章.SimpleDateFormat日期格式化类
    • 1.SimpleDateFormat介绍
    • 2.SimpleDateFormat常用方法
  • 第七章.JDK8新日期类
    • 1. LocalDate 本地日期
      • 1.1.获取LocalDate对象
      • 1.2.LocalDateTime对象
      • 1.3.获取日期字段的方法 : 名字是get开头
      • 1.4.设置日期字段的方法 : 名字是with开头
      • 1.5.日期字段偏移
    • 2.Period和Duration类
      • 2.1 Period 计算日期之间的偏差
      • 2.2 Duration计算时间之间的偏差
    • 3.DateTimeFormatter日期格式化类
  • 第八章.System类
  • 第九章.Arrays数组工具类
  • 第十章.包装类
    • 1.基本数据类型对应的引用数据类型(包装类)
    • 2.Integer的介绍以及使用
      • 2.1.Integer基本使用
      • 2.2.自动拆箱装箱
    • 3.基本类型和String之间的转换
      • 3.1 基本类型往String转
      • 3.2 String转成基本数据类型
  • 常用API(1)
    • 1:API 概述
      • 1.1 API概述和课程安排
      • 1.2 包和导包
    • 2:Scanner
      • 2.1 Scanner基本使用
      • 2.2 练习(数据求和)
    • 3:Random
      • 3.1 Random基本使用
      • 3.2 练习(猜数字游戏)
    • 4:GUI
      • 4.1 GUI概述
      • 4.2 常用组件
        • 4.2.1 JFrame(初识窗体)
        • 4.2.2 JFrame(常用设置)
        • 4.2.3 JButton(窗口中添加按钮)
        • 4.2.4 JLabel(显示文本和图像)
      • 4.3 案例
        • 4.3.1 案例1(用户登录)
        • 4.3.2 案例2(聊天室)
        • 4.3.3 案例3(猜数字)
        • 4.3.4 案例4(手机日期和时间显示)
        • 4.3.5 案例5(考勤查询)
        • 4.3.6 案例5(考勤查询之日历控件)
      • 4.4 事件监听机制
  • 1 编程题
    • 1.1 视频中的案例
    • 1.2 编程题一
    • 1.3 编程题二
    • 1.4 编程题三
  • 常用API(2)
    • 1:String
      • 1.1 String(构造方法)
      • 1.2 String(成员方法)
      • 1.3 GUI案例1(用户登录实现)
      • 1.4 GUI案例2(聊天室实现)
    • 2:Integer
      • 2.1 Integer(构造方法)
      • 2.2 Integer(int和String的相互转换)
      • 2.3 GUI案例3(猜数字实现)
      • 2.4 Integer(自动装箱和拆箱)
    • 3:Date和SimpleDateFormat
      • 3.1 Date(构造方法)
      • 3.2 SimpleDateFormat(Date和String的相互转换)
      • 3.3 GUI案例4(手机日期和时间显示实现)
      • 3.4 GUI案例5(考勤查询实现)
  • 1 简答题
    • 1.1 简答题
    • 1.2 简答题
  • 2 编程题
          • 完成上课的案例
          • AttendanceQuery 考勤查询 (注意要在同包下准备DateChooser类)
          • ChatRoom 聊天室
          • GuessNumber 猜数字小游戏
          • ShowDateTime 展示当前日期
          • UserLogin 用户登录

模块14.基础API

第一章.String

1.String介绍

1.概述:String 类代表字符串
2.特点:
  a.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例(对象)实现
    凡是带双引号的,都是String的对象
    String s = "abc"
    "abc"就是对象;String就是对象的数据类型;s就是对象名
        
  b.字符串是常量,它们的值在创建之后不能更改
    String s = "hello"
    s+="world" -> 会产生新对象
        
  c.String 对象是不可变的,所以可以共享
    String s1 = "abc"
    String s2 = "abc"

2.String的实现原理 ★

1.jdk8的时候:String底层是一个被final修饰的char数组-> private final char[] value;
2.jdk9开始到之后:底层是一个被final修饰的byte数组-> private final byte[] value;

  一个char类型占2个字节
  一个byte类型占1个字节 -> 省内存空间  
字符串定义完之后,数组就创建好了,final一修饰,数组的地址值直接定死

3.String的创建 (无参、字符串、字符数组、字节数组)

1.String()  -> 利用String的无参构造创建String对象
2.String(String original) -> 根据字符串创建String对象
3.String(char[] value) -> 根据char数组创建String对象
4.String(byte[] bytes) -> 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
                          a.平台:操作系统
                          b.操作系统默认字符集:GBK
                            GBK:一个中文占2个字节
                            UTF-8:一个中文占3个字节
                            而且,中文对应的字节一般都是负数
                                
                            代码在idea中写的,idea启动的时候,会自动加一个启动参数,此启动参数为UTF-8
                            -Dfile.encoding=UTF-8    
    
5.简化形式:
  String 变量名 = ""
public class Demo02String {
    public static void main(String[] args) {
        //1.String()  -> 利用String的无参构造创建String对象
        String s1 = new String(); //
        System.out.println(s1);
        //2.String(String original) -> 根据字符串创建String对象
        String s2 = new String("abc");
        System.out.println(s2);
        //3.String(char[] value) -> 根据char数组创建String对象
        char[] chars = {'a','b','c'};
        String s3 = new String(chars);
        System.out.println(s3);
        /*
          4.String(byte[] bytes) -> 通过使用平台的默认字符集解码指定的 byte 数组,
                                    构造一个新的 String
         */
        byte[] bytes1 = {97,98,99};
        String s4 = new String(bytes1);
        System.out.println(s4);

        byte[] bytes2 = {-97,-98,-99};
        String s5 = new String(bytes2);
        System.out.println(s5);

        byte[] bytes3 = {-28,-67,-96};
        String s6 = new String(bytes3);
        System.out.println(s6);

        //5.简化形式
        String s7 = "abc";
        System.out.println(s7);
    }
}

1.String(char[] value, int offset, int count)->char数组的一部分转成String对象 
         value:要转Stringchar数组
         offset:从数组的哪个索引开始转
         count:转多少个
2.String(byte[] bytes, int offset, int length)->byte数组的一部分转成String对象 
         bytes:要转Stringbyte数组
         offset:从数组的哪个索引开始转
         length:转多少个
public class Demo03String {
    public static void main(String[] args) {
       /* 1.String(char[] value, int offset, int count)->将char数组的一部分转成String对象
        value:要转String的char数组
        offset:从数组的哪个索引开始转
        count:转多少个*/
        char[] chars = {'a','b','c','d','e','f'};
        String s1 = new String(chars,1,3);
        System.out.println(s1);
       /* 2.String(byte[] bytes, int offset, int length)->将byte数组的一部分转成String对象
        bytes:要转String的byte数组
        offset:从数组的哪个索引开始转
        length:转多少个*/
        byte[] bytes = {97,98,99,100,101};
        String s2 = new String(bytes,0,2);
        System.out.println(s2);
    }
}

4.String 面试题【String s = new String(“abc”)】

public class Demo04String {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//false
        System.out.println(s2==s3);//false
    }
}

1:String s = new String("abc")共有几个对象? 2个
    一个new本身   一个是"abc"2:String s = new String("abc")共创建了几个对象?  1个或者2个
    就看abc有没有提前创建出来了

1704352863873

5.字符串常见问题

public class Demo05String {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        String s4 = "hello"+"world";
        String s5 = s1+"world";
        String s6 = s1+s2;

        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s3==s6);//false
    }
}

1.字符串拼接,如果等号右边是字符串字面值拼接,不会产生新对象

2.字符串拼接,如果等号右边有变量参数拼接,会产生新字符串对象

第二章.String的方法

1.判断方法(equals equalsIgnoreCase)

boolean equals(String s) -> 比较字符串内容
boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写           
public class Demo01String {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        String s3 = "Abc";
        System.out.println(s1==s2);//比较地址值了

        //boolean equals(String s) -> 比较字符串内容
        System.out.println(s1.equals(s2));
        //boolean equalsIgnoreCase(String s) -> 比较字符串内容,忽略大小写
        System.out.println(s1.equalsIgnoreCase(s3));

        System.out.println("=========================");
        String s4 = "123";
        String s5 = "一二三";
        System.out.println(s4.equalsIgnoreCase(s5));//false
        String s6 = "壹贰叁";
        System.out.println(s5.equalsIgnoreCase(s6));//false
    }
}

2.练习1

已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录成功与否,给出相应的提示
步骤:
  1.先定义两个字符串,表示注册过的用户名和密码
  2.创建Scanner对象,键盘录入用户名和密码
  3.比较,如果输入的用户名和密码跟已经注册过的用户名和密码内容一样,就登录成功,否则就登录失败
public class Demo02String {
    public static void main(String[] args) {
        //1.先定义两个字符串,表示注册过的用户名和密码
        String username = "root";
        String password = "123";
        //2.创建Scanner对象,键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请您输入用户名:");
            String name = sc.next();
            System.out.println("请您输入密码:");
            String pwd = sc.next();
            //3.比较,如果输入的用户名和密码跟已经注册过的用户名和密码内容一样,就登录成功,否则就登录失败
            if (name.equals(username) && pwd.equals(password)) {
                System.out.println("登录成功");
                break;
            } else {
                if (i == 2) {
                    System.out.println("账号冻结");
                } else {
                    System.out.println("登录失败!");
                }
            }
        }
    }
}

package com.atguigu.b_stringmethod;

import java.util.Objects;

public class Demo03String {
    public static void main(String[] args) {
        //String s = "abc";
        String s = null;
        //method(s);

        String s1 = null;
        String s2 = "abc";
        method01(s1,s2);
    }

    /*
      工具类:Objects
      方法:判断两个对象是否相等 -> 自带防空指针作用
          public static boolean equals(Object a, Object b) {
             return (a == b) || (a != null && a.equals(b));
          }

     */
    private static void method01(String s1, String s2) {
      if (Objects.equals(s1,s2)){
          System.out.println("是abc");
      }else{
          System.out.println("不是abc");
      }
    }

    /*
      如果传递过来的对象是null,再去点其他方法,就会空指针
      解决:不要让一个字符串变量去点,用确定的字符串去点,可以防空
     */
    private static void method(String s) {
        /*if (s.equals("abc")){
            System.out.println("是abc");
        }else{
            System.out.println("不是abc");
        }*/
        if ("abc".equals(s)){
            System.out.println("是abc");
        }else{
            System.out.println("不是abc");
        }
    }
}

3.获取功能(length()、concat、charAt、indoxOf、subString)

int length() -> 获取字符串长度
String concat(String s)-> 字符串拼接,返回新串儿
char charAt(int index) -> 根据索引获取对应的字符
int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束
                                                 含头不含尾,返回新串儿
public class Demo04String {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        //int length() -> 获取字符串长度
        System.out.println(s1.length());
        //String concat(String s)-> 字符串拼接,返回新串儿
        System.out.println(s1.concat("haha"));
        //char charAt(int index) -> 根据索引获取对应的字符
        System.out.println(s1.charAt(0));
        //int indexOf(String s) -> 获取指定字符串在大字符串中第一次出现的索引位置
        System.out.println(s1.indexOf("a"));
        //String subString(int beginIndex) -> 截取字符串,从指定索引开始截取到最后,返回新串儿
        System.out.println(s1.substring(3));
        //String subString(int beginIndex,int endIndex) -> 截取字符串,从beginIndex开始到endIndex结束
        //含头不含尾,返回新串儿
        System.out.println(s1.substring(1,6));

    }
}

4.练习2

遍历字符串
public class Demo05String {
    public static void main(String[] args) {
        String s = "abcdefg";
        for (int i = 0; i < s.length(); i++) {
            System.out.println(s.charAt(i));
        }
    }
}

5.转换功能(toCharArray、getBytes、replace)

1.char[] toCharArray() -> 将字符串转成char数组
2.byte[] getBytes() -> 将字符串转成byte数组
3.String replace(CharSequence c1,CharSequence c2)-> 替换字符
                 CharSequence->String的接口
    
4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组    
public class Demo06String {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "abcdefg";
        //1.char[] toCharArray() -> 将字符串转成char数组
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
        System.out.println("===============");
        //2.byte[] getBytes() -> 将字符串转成byte数组
        byte[] bytes = s.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }
        System.out.println("===============");
        //3.String replace(CharSequence c1,CharSequence c2)-> 替换字符 CharSequence->String的接口
        System.out.println(s.replace("a","z"));

        System.out.println("===============");
        //4.byte[] getBytes(String charsetName) -> 按照指定的编码将字符串转成byte数组
        byte[] bytes1 = "你好".getBytes("GBK");
        for (int i = 0; i < bytes1.length; i++) {
            System.out.println(bytes1[i]);
        }

    }
}

7.练习4

键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
步骤:
  1.创建Scanner对象,键盘录入
  2.定义三个变量,用来统计
  3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
  4.统计大写字母
    A-Z -> 65-90
    比如:B -> 66 ->65-90之间,证明就是大写字母
  5.统计小写字母
    a-z -> 97-122
    比如:b -> 98 ->97-122之间,证明就是小写字母
  6.统计数字:
    0-9 -> 48-57
    比如:字符1 -> 49 ->48-57之间,证明就是数字
  7.将统计结果打印出来
public class Demo07String {
    public static void main(String[] args) {
        //1.创建Scanner对象,键盘录入
        Scanner sc = new Scanner(System.in);
        //2.定义三个变量,用来统计
        int big = 0;
        int small = 0;
        int number = 0;
        //3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
        String data = sc.next();
        char[] chars = data.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char num = chars[i];

             /*4.统计大写字母
                  A-Z -> 65-90
                  比如:B -> 66 -> 在65-90之间,证明就是大写字母*/
            if (num>='A' && num<='Z'){
                big++;
            }
             /*5.统计小写字母
                  a-z -> 97-122
                  比如:b -> 98 -> 在97-122之间,证明就是小写字母*/
            if (num>='a' && num<='z'){
                small++;
            }
             /*6.统计数字:
                  0-9 -> 48-57
                  比如:字符1 -> 49 -> 在48-57之间,证明就是数字*/
            if (num>='0' && num<='9'){
                number++;
            }
        }

        //7.将统计结果打印出来
        System.out.println("大写有"+big+"个");
        System.out.println("小写有"+small+"个");
        System.out.println("数字有"+number+"个");
    }
}

8.分割功能(split)

1.String[] split(String regex)->按照指定的规则分割字符串
  注意:regex写的是正则表达式 -> . 在正则表达式中代表任意一个字符
public class Demo08String {
    public static void main(String[] args) {
        String s = "abc,txt";
        String[] split = s.split(",");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }

        System.out.println("===============");
        String s2 = "haha.hehe";
        String[] split1 = s2.split("\\.");
        for (int i = 0; i < split1.length; i++) {
            System.out.println(split1[i]);
        }
    }
}

第三章.其他方法

contains、endsWith、startWith、toLowerCase、toUpperCase、trim
1.boolean contains(String s) -> 判断老串儿中是否包含指定的串儿
2.boolean endsWith(String s) -> 判断老串儿是否以指定的串儿结尾
3.boolean startsWith(String s) -> 判断老串儿是否以指定的串儿开头
4.String toLowerCase()-> 将字母转成小写
5.String toUpperCase() -> 将字母转成大写
6.String trim() -> 去掉字符串两端空格
public class Demo09String {
    public static void main(String[] args) {
        String s = "abcdefg";
        //1.boolean contains(String s) -> 判断老串儿中是否包含指定的串儿
        System.out.println(s.contains("a"));
        //2.boolean endsWith(String s) -> 判断老串儿是否以指定的串儿结尾
        System.out.println(s.endsWith("g"));
        //3.boolean startsWith(String s) -> 判断老串儿是否以指定的串儿开头
        System.out.println(s.startsWith("a"));
        //4.String toLowerCase()-> 将字母转成小写
        System.out.println("ADbcda".toLowerCase());
        //5.String toUpperCase() -> 将字母转成大写
        System.out.println("dafadRWERW".toUpperCase());
        //6.String trim() -> 去掉字符串两端空格
        System.out.println(" hadfhad hdsfha  sfhdsh ".trim());

        System.out.println("==================");
        System.out.println(" hadfhad hdsfha  sfhdsh ".replace(" ",""));
    }
}

第四章.StringBuilder类

1.StringBuilder的介绍

1.概述:一个可变的字符序列,此类提供了一个与StringBuffer兼容的一套API,但是不保证同步(线程不安全,效率高)
2.作用:主要是字符串拼接
3.问题:
  a.刚讲完String,String也能做字符串拼接,直接用+即可,但是为啥还要用StringBuilder去拼接呢?
  b.原因:
    String每拼接一次,就会产生新的字符串对象,就会在堆内存中开辟新的空间,如果拼接次数多了,会占用内存,效率比较底
        
    StringBuilder,底层自带一个缓冲区(没有被final修饰的byte数组)拼接字符串之后都会在此缓冲区中保存,在拼接的过程中,不会随意产生新对象,节省内存
        
4.StringBuilder的特点:
  a.底层自带缓冲区,此缓冲区是没有被final修饰的byte数组,默认长度为16
  b.如果超出了数组长度,数组会自动扩容
    创建一个新长度的新数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
  c.默认每次扩容老数组的2+2
    如果一次性添加的数据超出了默认的扩容数组长度(2+2),比如存了36个字符,超出了第一次扩容的34,就按照实际数据个数为准,就是以36扩容

StringBuilder,底层自带一个缓冲区(没有被final修饰的byte数组 拼接字符串之后都会在此缓冲区中保存,在拼接的过程中,不会随意产生新对象,节省内存

StringBuilder的特点:
a.底层自带缓冲区,此缓冲区是没有被final修饰的byte数组,默认长度为16
b.如果超出了数组长度,数组会自动扩容
创建一个新长度的新数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
c.默认每次扩容老数组的2倍+2
如果一次性添加的数据超出了默认的扩容数组长度(2倍+2),比如存了36个字符,超出了第一次扩容的34,就按照实际数据个数为准,就是以36扩容

2.StringBuilder的使用

append、reverse、toString
1.构造:
  StringBuilder()
  StringBuilder(String str)    
public class Demo01StringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        System.out.println(sb);

        StringBuilder sb1 = new StringBuilder("abc");
        System.out.println(sb1);

    }
}
常用方法:
  StringBuilder append(任意类型数据) -> 字符串拼接,返回的是StringBuilder自己
  StringBuilder reverse()-> 字符串翻转,返回的是StringBuilder自己
  String toString() ->StringBuilder转成String->StringBuilder拼接字符串是为了效率,为了不占内存,那么拼完之后我们后续可能会对拼接好的字符串进行处理,就需要调用String中的方法,所以需要将StringBuilder转成String 
public class Demo02StringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        StringBuilder sb1 = sb.append("张无忌");
        System.out.println(sb1);
        System.out.println(sb);
        System.out.println(sb==sb1);

        System.out.println("==============");
        //链式调用
        sb.append("赵敏").append("周芷若").append("小昭");
        System.out.println(sb);

        sb.reverse();
        System.out.println(sb);

        String s = sb.toString();
        System.out.println(s);
    }
}

练习:键盘录入一个字符串,判断此字符串是否为"回文内容"  
    比如: abcba  上海自来水来自海上
public class Demo03StringBuilder {
    public static void main(String[] args) {
        //1.创建Scanner对象
        Scanner sc = new Scanner(System.in);
        String data = sc.next();
        //2.创建StringBuilder对象
        StringBuilder sb = new StringBuilder(data);
        //3.翻转
        sb.reverse();
        //4.将StringBuilder转成String
        String s = sb.toString();
        if (data.equals(s)){
            System.out.println("是回文内容");
        }else{
            System.out.println("不是回文内容");
        }

    }
}

3.练习

定义一个数组,[元素1, 元素2, 元素3..]的形式输出,StringBuilder拼接
自己做

String:拼接字符串效率低,每拼接一次,都会产生一个新的字符串对象,耗费内存资源

StringBuilder和StringBuffer区别:

a.相同点:

用法一样,作用一样

b.不同点:

StringBuilder:拼接效率比StringBuffer高

​ 线程不安全

StringBuffer:效率比较底,线程安全

拼接效率:StringBuilder>StringBuffer>String

模块15.常用API

模块14回顾:
  String:
    1.构造:
      String()  String(String s) String(char[] chars) String(byte[] bytes)
      String(char[] chars,int offset,int count) String(byte[] chars,int offset,int count)
   
    2.判断方法:
      equals   equalsIgnoreCase
          
    3.获取方法:
      length()  concat(String s)  charAt(int index) indexOf(String s) subString(开始索引)
      subString(开始索引,结束索引) -> 含头不含尾
          
    4.转换方法:
      toCharArray()  getBytes()   getBytes(String charsetName) replace(c1,c2)
       
    5.分割方法:
      split(String regex)
          
    6.其他方法:
      contains(String s) endsWith(String s) statsWith(String s) toLowerCase()
      toUpperCase() trim()
          
       
  StringBuilder:
    1.append(任意类型数据)
    2.reverse()
    3.toString()
        
模块十五重点:
   1.BigIntegerBigDecimal操作
   2.DateSimpleDateFormat的操作
   3.System中的常用方法 -> 主要是数组复制
   4.Arrays中的常用方法
   5.会利用包装类定义一个标准的javabean
   6.会包装类和String之间的转换

第一章.Math类

1.Math类介绍

1.概述:数学工具类
2.作用:主要用于数学运算
3.特点:
  a.构造方法私有了
  b.方法都是静态的
4.使用:
  类名直接调用

2.Math类方法

abs、ceil、floor、round、max、min

static int abs(int a) -> 求参数的绝对值
static double ceil(double a) -> 向上取整
static double floor(double a) ->向下取整
static long round(double a)  -> 四舍五入
static int max(int a, int b) ->求两个数之间的较大值 
static int min(int a, int b) ->求两个数之间的较小值
public class Demo01Math {
    public static void main(String[] args) {
        //static int abs(int a) -> 求参数的绝对值
        System.out.println(Math.abs(-10));
        //static double ceil(double a) -> 向上取整
        System.out.println(Math.ceil(3.6));
        //static double floor(double a) ->向下取整
        System.out.println(Math.floor(3.6));
        //static long round(double a)  -> 四舍五入
        System.out.println(Math.round(3.6));
        System.out.println(Math.round(-2.8));
        //static int max(int a, int b) ->求两个数之间的较大值
        System.out.println(Math.max(10,20));
        //static int min(int a, int b) ->求两个数之间的较小值
        System.out.println(Math.min(10,20));
    }
}

第二章.BigInteger

1.BigInteger介绍

add、subtract、multiply、divide

1.问题描述:我们操作数据,将来的数据有可能非常大,大到比long还要大,这种数据我们一般称之为"对象"
2.作用:
  处理超大整数
3.构造:
  BigInteger(String val) -> 参数的格式必须是数字形式
4.方法:
  BigInteger add(BigInteger val)  返回其值为 (this + val)BigInteger
  BigInteger subtract(BigInteger val) 返回其值为 (this - val)BigInteger
  BigInteger multiply(BigInteger val)  返回其值为 (this * val)BigInteger
  BigInteger divide(BigInteger val)    返回其值为 (this / val)BigInteger   

2.BigInteger使用

public class Demo02BigInteger {
    public static void main(String[] args) {
        BigInteger b1 = new BigInteger("121212121212121212121212121212121212121");
        BigInteger b2 = new BigInteger("121212121212121212121212121212121212121");
        //BigInteger add(BigInteger val)  返回其值为 (this + val) 的 BigInteger
        System.out.println(b1.add(b2));
        //BigInteger subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger
        System.out.println(b1.subtract(b2));
        //BigInteger multiply(BigInteger val)  返回其值为 (this * val) 的 BigInteger
        System.out.println(b1.multiply(b2));
        //BigInteger divide(BigInteger val)    返回其值为 (this / val) 的 BigInteger
        System.out.println(b1.divide(b2));
    }
}

int intValue() 将BigInteger转成int

long longValue() 将BigInteger 转成 long

BigInteger上限:42亿的21亿次方,内存根本扛不住,所以我们可以认为BigInteger无上限

第三章.BigDecimal类

1.BigDecimal介绍

1.问题描述:我们知道直接用float或者double做运算会出现精度损失的问题,所以将来设计到钱,我们就不能用float或者double直接做运算
    
2.作用:主要是解决floatdouble直接做运算出现的精度损失问题
    
3.构造方法:
  BigDecimal(String val)  -> val必须要是数字形式
      
4.常用方法:
  static BigDecimal valueOf(double val)  -> 此方法初始化小数时可以传入double型数据
  BigDecimal add(BigDecimal val)  返回其值为 (this + val)BigDecimal
  BigDecimal subtract(BigDecimal val) 返回其值为 (this - val)BigDecimal
  BigDecimal multiply(BigDecimal val)  返回其值为 (this * val)BigDecimal
  BigDecimal divide(BigDecimal val)    返回其值为 (this / val)BigDecimal 
  BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)  
                    divisor:除号后面的那个数
                    scale:指定保留几位小数
                    roundingMode:取舍方式
                                 static int ROUND_UP -> 向上加1
                                 static int ROUND_DOWN -> 直接舍去
                                 static int ROUND_HALF_UP -> 四舍五入
      
5.注意:
  如果除不尽,会报错,出现运算异常

2.BigDecimal使用

public class Demo03BigDecimal {
    public static void main(String[] args) {
        //big01();
        //big02();
        big03();
    }

    private static void big03() {
        BigDecimal b1 = new BigDecimal("3.55");
        BigDecimal b2 = new BigDecimal("2.12");
        BigDecimal divide = b1.divide(b2, 2, BigDecimal.ROUND_UP);
        System.out.println("divide = " + divide);
        double v = divide.doubleValue();
        System.out.println("v = " + v);
    }

    private static void big02() {
        BigDecimal b1 = new BigDecimal("3.55");
        //BigDecimal b2 = new BigDecimal("2.12");
        BigDecimal b2 = BigDecimal.valueOf(2.12);

        //BigDecimal add(BigDecimal val)  返回其值为 (this + val) 的 BigDecimal
        BigDecimal add = b1.add(b2);
        System.out.println("add = " + add);
        //BigDecimal subtract(BigDecimal val) 返回其值为 (this - val) 的 BigDecimal
        BigDecimal subtract = b1.subtract(b2);
        System.out.println("subtract = " + subtract);
        //BigDecimal multiply(BigDecimal val)  返回其值为 (this * val) 的 BigDecimal
        BigDecimal multiply = b1.multiply(b2);
        System.out.println("multiply = " + multiply);
        //BigDecimal divide(BigDecimal val)    返回其值为 (this / val) 的 BigDecimal
        BigDecimal divide = b1.divide(b2);
        System.out.println("divide = " + divide);

    }

    private static void big01() {
        float a = 3.55F;
        float b = 2.12F;

        float result = a-b;
        System.out.println("result = " + result);//1.4300001
    }
}


double doubleValue() 将此BigDecimal转成double

3.BigDecimal除法过时方法解决

1.注意:如果调用的成员上面有一个横线,证明此成员过时了,底层会有一个注解@Deprecated修饰,但是过时的成员还能使用,只不过被新的成员代替了,不推荐使用了
    
2.方法:
  divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 
         divisor:代表除号后面的数据
         scale:保留几位小数
         roundingMode:取舍方式-> RoundingMode是一个枚举,里面的成员可以类名直接调用
                                UP:向上加1 
                                DOWN:直接舍去 
                                HALF_UP:四舍五入 
    private static void big04() {
        BigDecimal b1 = new BigDecimal("3.55");
        BigDecimal b2 = new BigDecimal("2.12");
        BigDecimal divide = b1.divide(b2, 2, RoundingMode.HALF_UP);
        System.out.println("divide = " + divide);
    }

第四章.Date日期类

1.Date类的介绍

 1.概述:表示特定的瞬间,精确到毫秒
 2.常识:
   a.1000毫秒 = 1秒
   b.时间原点:197011000(UNIX系统起始时间),叫做格林威治时间,0时区上
   c.时区:北京位于东八区,一个时区经度差15,时间相差一个小时,所以北京时间比时间原点所在时区时间差8个小时
   d.北京经纬度:东经116 北纬39.56 -> 温带大陆性季风气候
   e.赤道   本初子午线(0度经线)    

2.Date类的使用

1.构造:
  Date() -> 获取当前系统时间
  Date(long time) -> 获取指定时间,传递毫秒值 -> 从时间原点开始算   
    private static void date01() {
        //Date() -> 获取当前系统时间
        Date date1 = new Date();
        System.out.println("date1 = " + date1);
        //Date(long time) -> 获取指定时间,传递毫秒值 -> 从时间原点开始算
        Date date2 = new Date(1000L);
        System.out.println("date2 = " + date2);
    }

3.Date类的常用方法

1.void setTime(long time) -> 设置时间,传递毫秒值-> 从时间原点开始算
2.long getTime()->获取时间,返回毫秒值
        private static void date02() {
            Date date = new Date();
            //1.void setTime(long time) -> 设置时间,传递毫秒值-> 从时间原点开始算
            date.setTime(1000L);
            //2.long getTime()->获取时间,返回毫秒值
            System.out.println(date.getTime());
        }

第五章.Calendar日历类

1.Calendar介绍

1.概述:日历类,抽象类
2.获取:Calendar中的方法:
      static Calendar getInstance() 
3.月份对比:
  国外: 0 1 2 3 4 5 6 7 8 9  10 11
  国内: 1 2 3 4 5 6 7 8 9 10 11 12    

常用方法:
  int get(int field) ->返回给定日历字段的值
  void set(int field, int value)  :将给定的日历字段设置为指定的值
  void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或者减去指定的时间量
  Date getTime():Calendar转成Date对象
      
field:代表的是日历字段-> 年 月 日 星期等,都是静态的    
    private static void calendar02() {
        Calendar calendar = Calendar.getInstance();//多态
        //int get(int field) ->返回给定日历字段的值
        int year = calendar.get(Calendar.YEAR);
        System.out.println("year = " + year);
        //void set(int field, int value)  :将给定的日历字段设置为指定的值
        //calendar.set(Calendar.YEAR,2028);
        //System.out.println(calendar.get(Calendar.YEAR));
        //void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或者减去指定的时间量
        calendar.add(Calendar.YEAR,-1);
        System.out.println(calendar.get(Calendar.YEAR));
        //Date getTime():将Calendar转成Date对象
        Date date = calendar.getTime();
        System.out.println("date = " + date);
    }

扩展方法:

void set(int year, int month, int date) -> 直接设置年月日

需求:键盘录入一个年份,判断这一年是闰年,还是平年
步骤:
  1.创建Calendar对象
  2.创建Scanner对象,键盘录入一个年份
  3.调用set方法,传递年,,set(,2,1) -> 国外是0-11,所以设置成2月就是代表34.将day减1(31日减1,就是2月最后一天,知道2月最后一天了,就知道是平年还是闰年了)
  5.获取day判断平年还是闰年,输出结果    
private static void calendar03() {
        //1.创建Calendar对象
        Calendar calendar = Calendar.getInstance();
        //2.创建Scanner对象,键盘录入一个年份
        Scanner sc = new Scanner(System.in);
        int year = sc.nextInt();
        //3.调用set方法,传递年,月,日
        //set(年,2,1) -> 国外是0-11,所以设置成2月就是代表3月
        calendar.set(year,2,1);
        //4.将day减1天(3月1日减1天,就是2月最后一天,知道2月最后一天了,就知道是平年还是闰年了)
        calendar.add(Calendar.DATE,-1);
        int day = calendar.get(Calendar.DATE);
        //5.获取day判断平年还是闰年,输出结果
        if (day==29){
            System.out.println("闰年");
        }else{
            System.out.println("平年");
        }

    }

第六章.SimpleDateFormat日期格式化类

1.SimpleDateFormat介绍

1.概述:日期格式化类
2.构造:
  SimpleDateFormat(String pattern)
3.pattern代表啥:代表的是我们自己指定的日期格式
  字母不能改变,但是中间的连接符我们可以改变 
  
  yyyy-MM-dd HH:mm:ss  
    
时间字母表示说明
y
M
d
H
m
s

2.SimpleDateFormat常用方法

1.String format(Date date) ->Date对象按照指定的格式转成String 
2.Date parse(String source)-> 将符合日期格式的字符串转成Date对象      
public class Demo03SimpleDateFormat {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //1.String format(Date date) -> 将Date对象按照指定的格式转成String
        String time1 = sdf.format(new Date());
        System.out.println("time1 = " + time1);
        //2.Date parse(String source)-> 将符合日期格式的字符串转成Date对象
        String time2 = "2000-10-10 10:10:10";
        Date date = sdf.parse(time2);
        System.out.println("date = " + date);
    }
}

第七章.JDK8新日期类

1. LocalDate 本地日期

1.1.获取LocalDate对象

1.概述:LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年月日
2.获取:
  static LocalDate now()  -> 创建LocalDate对象
  static LocalDate of(int year, int month, int dayOfMonth)  -> 创建LocalDate对象,设置年月日   
public class Demo04LocalDate {
    public static void main(String[] args) {
        //static LocalDate now()  -> 创建LocalDate对象
        LocalDate localDate = LocalDate.now();
        System.out.println("localDate = " + localDate);
        //static LocalDate of(int year, int month, int dayOfMonth)  -> 创建LocalDate对象,设置年月日
        LocalDate localDate1 = LocalDate.of(2000, 10, 10);
        System.out.println("localDate1 = " + localDate1);
    }
}

1.2.LocalDateTime对象

1.LocalDateTime概述:LocalDateTime是一个不可变的日期时间对象,代表日期时间,通常被视为年 ----- 秒。
 
2.获取:
static LocalDateTime now()  创建LocalDateTime对象
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) 创建LocalDateTime对象,设置年月日时分秒
public class Demo05LocalDateTime {
    public static void main(String[] args) {
        //static LocalDateTime now()  创建LocalDateTime对象
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime = " + localDateTime);
        //static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) 创建LocalDateTime对象,设置年月日时分秒
        LocalDateTime localDateTime1 = LocalDateTime.of(2000, 10, 10, 10, 10, 10);
        System.out.println("localDateTime1 = " + localDateTime1);
    }
}

1.3.获取日期字段的方法 : 名字是get开头

int getYear()->获取年份
int getMonthValue()->获取月份
int getDayOfMonth()->获取月中的第几天
private static void get() {
        LocalDate localDate = LocalDate.now();
        //int getYear()->获取年份
        System.out.println(localDate.getYear());
        //int getMonthValue()->获取月份
        System.out.println(localDate.getMonthValue());
        //int getDayOfMonth()->获取月中的第几天
        System.out.println(localDate.getDayOfMonth());
    }

1.4.设置日期字段的方法 : 名字是with开头

LocalDate withYear(int year):设置年份
LocalDate withMonth(int month):设置月份
LocalDate withDayOfMonth(int day):设置月中的天数
    private static void with() {
        LocalDate localDate = LocalDate.now();
        //LocalDate withYear(int year):设置年份
        //LocalDate localDate1 = localDate.withYear(2000);
        //System.out.println(localDate1);

        //LocalDate withMonth(int month):设置月份
        //LocalDate localDate2 = localDate1.withMonth(10);
        //System.out.println("localDate2 = " + localDate2);
        //LocalDate withDayOfMonth(int day):设置月中的天数

        //LocalDate localDate3 = localDate2.withDayOfMonth(10);
        //System.out.println("localDate3 = " + localDate3);

        LocalDate localDate1 = localDate.withYear(2000).withMonth(10).withDayOfMonth(10);
        System.out.println("localDate1 = " + localDate1);
    }

1.5.日期字段偏移

设置日期字段的偏移量,方法名plus开头,向后偏移
设置日期字段的偏移量,方法名minus开头,向前偏移
    /*
      向后偏移 -> plus开头方法
      向前偏移 -> minus开头方法
     */
    private static void plusAndMinus() {
        LocalDate localDate = LocalDate.now();
       // LocalDate localDate1 = localDate.plusYears(1L);
       // System.out.println("localDate1 = " + localDate1);
        LocalDate localDate1 = localDate.minusYears(1L);
        System.out.println("localDate1 = " + localDate1);

    }

2.Period和Duration类

2.1 Period 计算日期之间的偏差

方法:
  static Period between(LocalDate d1,LocalDate d2):计算两个日期之间的差值
  
  getYears()->获取相差的年
  getMonths()->获取相差的月
  getDays()->获取相差的天
    private static void period() {
        LocalDate local1 = LocalDate.of(2022, 12, 12);
        LocalDate local2 = LocalDate.of(2021, 11, 11);

        Period period = Period.between(local2, local1);

        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }

2.2 Duration计算时间之间的偏差

1.static Duration between(Temporal startInclusive, Temporal endExclusive)  -> 计算时间差
2.Temporal : 是一个接口
  实现类:LocalDate LocalDateTime
      
3.参数需要传递 Temporal 的实现类对象, 注意要传递LocalDateTime
  因为Duration计算精确时间偏差,所以需要传递能操作精确时间的 LocalDateTime
      
      
4.利用Dutation获取相差的时分秒 -> to开头
  toDays() :获取相差天数
  toHours(): 获取相差小时
  toMinutes():获取相差分钟
  toMillis():获取相差秒(毫秒)
    private static void duration() {
        LocalDateTime local1 = LocalDateTime.of(2022, 12, 12,12,12,12);
        LocalDateTime local2 = LocalDateTime.of(2021, 11, 11,11,11,11);
        Duration duration = Duration.between(local2, local1);
        System.out.println(duration.toDays());
        System.out.println(duration.toHours());
        System.out.println(duration.toMinutes());
        System.out.println(duration.toMillis());
    }

如果计算年月日 ,就用Period

如果计算时分秒,就用Duration

3.DateTimeFormatter日期格式化类

1.获取:
  static DateTimeFormatter ofPattern(String pattern)   -> 获取对象,指定格式
2.方法:
  String format(TemporalAccessor temporal)-> 将日期对象按照指定的规则转成String 
                TemporalAccessor:接口,子接口有Temporal
                Temporal的实现类:LocalDate LocalDateTime    
                    
  TemporalAccessor parse(CharSequence text)-> 将符合规则的字符串转成日期对象 
                   如果想将TemporalAccessor转成我们常见的LocalDateTime日期对象,就需要用到LocalDateTime中的静态方法:
                   static LocalDateTime from(TemporalAccessor temporal)  
    private static void parse() {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String time = "2000-10-10 10:10:10";
        TemporalAccessor temporalAccessor = dtf.parse(time);
        //System.out.println(temporalAccessor);
        LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
        System.out.println("localDateTime = " + localDateTime);
    }

第八章.System类

1.概述:系统相关类,是一个工具类
2.特点:
  a.构造私有,不能利用构造方法new对象
  b.方法都是静态的
3.使用:
 类名直接调用
方法说明
static long currentTimeMillis()返回以毫秒为单位的当前时间,可以测效率
static void exit(int status)终止当前正在运行的 Java 虚拟机
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length数组复制
src:源数组
srcPos:从源数组的哪个索引开始复制
dest:目标数组
ldestPos:从目标数组哪个索引开始粘贴
length:复制多少个元素
public class Demo01System {
    public static void main(String[] args) {
        //currentTimeMillis();
        //exit();
        arraycopy();
    }

    /*
      static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
             src:源数组
             srcPos:从源数组的哪个索引开始复制
             dest:目标数组
             destPos:从目标数组的哪个索引开始粘贴
             length:复制多少个元素
     */
    private static void arraycopy() {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = new int[10];
        System.arraycopy(arr1,0,arr2,0,5);
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+" ");
        }

    }

    private static void exit() {
        for (int i = 0; i < 100; i++) {
            if (i==5){
                System.exit(0);
            }
            System.out.println("helloworld"+i);
        }
    }

    private static void currentTimeMillis() {
        long time = System.currentTimeMillis();
        System.out.println("time = " + time);
    }
}

第九章.Arrays数组工具类

1.概述:数组工具类
2.特点:
  a.构造私有
  b.方法静态
3.使用:类名直接调用
方法说明
static String toString(int[] a)按照格式打印数组元素
[元素1, 元素2, …]
static void sort(int[] a)升序排序
static int binarySearch(int[] a, int key)二分查找(前提是升序)
static int[] copyOf(int[] original, int newLength)数组扩容
public class Demo02Arrays {
    public static void main(String[] args) {
        int[] arr = {5,3,4,6,5,4,7};
        System.out.println(Arrays.toString(arr));

        System.out.println("==============");
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

        System.out.println("==============");
        int[] arr1 = {1,2,3,4,5,6,7};
        int index = Arrays.binarySearch(arr1, 3);
        System.out.println("index = " + index);

        System.out.println("==============");
        int[] arr2 = {1,2,3,4,5};
        int[] newArr = Arrays.copyOf(arr2, 10);
        System.out.println(Arrays.toString(newArr));
        
        arr2 = newArr;
        System.out.println(Arrays.toString(arr2));

    }
}

第十章.包装类

1.基本数据类型对应的引用数据类型(包装类)

1.概述:就是基本类型对应的类(包装类),我们需要将基本类型转成包装类,从而让基本类型拥有类的特性(说白了,将基本类型转成包装类之后,就可以使用包装类中的方法操作数据)
    
2.为啥要学包装类:
  a.将来有一些特定场景,特定操作,比如调用方法传递包装类
    比如:ArrayList集合,里面有一个方法add(Integer i),此时我们不能调用add方法之后直接传递基本类型,因为引用类型不能直接接收基本类型的值,就需要先将基本类型转成包装类,传递到add方法中
  b.将来我们还可以将包装类转成基本类型:
    包装类不能直接使用+ - * /,所以需要将包装类转成基本类型,才能使用+ - * /
基本类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharactor
booleanBoolean

2.Integer的介绍以及使用

2.1.Integer基本使用

1.概述:Integerint的包装类
2.构造:  不推荐使用了,但是还能用
  Integer(int value)
  Integer(String s) s必须是数字形式
public class Demo01Integer {
    public static void main(String[] args) {
        Integer i1 = new Integer(10);
        System.out.println("i1 = " + i1);

        Integer i2 = new Integer("10");
        System.out.println("i2 = " + i2);

        System.out.println("================");

        Boolean b1 = new Boolean("true");
        System.out.println("b1 = " + b1);

        Boolean b2 = new Boolean("false");
        System.out.println("b2 = " + b2);

        Boolean b3 = new Boolean("True");
        System.out.println("b3 = " + b3);
    }
}

1.装箱:将基本类型转成对应的包装类
2.方法:
  static Integer valueOf(int i)  
  static Integer valueOf(String s)  
public class Demo02Integer {
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf(10);
        System.out.println("i1 = " + i1);

        Integer i2 = Integer.valueOf("100");
        System.out.println("i2 = " + i2);
    }
}
1.拆箱:将包装类转成基本类型
2.方法:
  int intValue();
public class Demo03Integer {
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf(10);
        System.out.println("i1 = " + i1);

        int i = i1.intValue();
        System.out.println("(i+10) = " + (i + 10));
    }
}

2.2.自动拆箱装箱

1.拆箱和装箱很多时候都是自动完成的
public class Demo04Integer {
    public static void main(String[] args) {
        Integer i = 10;//发生了自动装箱了
        Integer sum = i+10;//发生了自动拆箱装箱
        System.out.println("sum = " + sum);
    }
}

public class Demo05Integer {
public static void main(String[] args) {
  Integer i1 = 100;
  Integer i2 = 100;
  System.out.println(i1==i2);

  Integer i3 = 128;
  Integer i4 = 128;
  System.out.println(i3==i4);
}
}

3.基本类型和String之间的转换

3.1 基本类型往String转

1.方式1:
  + 拼接
2.方式2:String中的静态方法
  static String valueOf(int i) 
  private static void method01() {
        int i = 10;
        String s1 = i+"";
        System.out.println(s1+1);

        System.out.println("============");

        String s = String.valueOf(10);
        System.out.println(s+1);
    }

3.2 String转成基本数据类型

每个包装类中都有一个类似的方法:  parseXXX
位置方法说明
Bytestatic byte parseByte(String s)将String转byte类型
Shortstatic short parseShort(String s)将String转成short类型
Integerstatic int parseInt(String s)将String转成int类型
Longstatic long parseLong(String s)将String转成long类型
Floatstatic float parseFloat(String s)将String转成float类型
Doublestatic double parseDouble(String s)将String转成double类型
Booleanstatic boolean parseBoolean(String s)将String转成boolean类型
    private static void method02() {
        int number = Integer.parseInt("1111");
        System.out.println(number+1);
    }
1.在实际开发过程中如何定义一个标准javabean
  定义javabean的时候一般会将基本类型的属性定义成包装类型的属性  
public class User {
    //private int uid;//用户id
    private Integer uid;//用户id
    private String username;//用户名
    private String password;//密码

    public User() {
    }

    public User(Integer uid, String username, String password) {
        this.uid = uid;
        this.username = username;
        this.password = password;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
1.举例:如果uid为Integer,默认值是null
2.将来javabean中的数据都是和数据库表联系起来的,我们可以将javabean中的数据添加到表中
  如果表中的uid为主键自增的,此时添加语句时uid中的数据不用我们单独维护赋值了,添加语句的sql语句就可以这样写:
  insert into user(uid,username,password) values (NULL,'金莲','36666');

3.到时候,我们需要将javabean中封装的数据获取出来放到sql语句中,如果uid为主键自增,而且javabean中的uid为包装类型,默认值为NULL,这样就不用单独维护uid的值了,也不用先给javabean中的uid赋值,然后在保存到数据库中了,咱们就可以直接使用uid的默认值,将默认值放到sql语句的uid列中
    
4.而且将javabean中的属性变成包装类,还可以使用包装类中的方法去操作此属性值    

常用API(1)

今日目标:

  • 能够知道什么是API
  • 能够使用帮助文档学习API
  • 能够理解包和导包
  • 能够知道Scanner的作用和基本使用
  • 能够知道Random的作用和基本使用
  • 能够知道GUI的作用和基本使用
  • 能够完成GUI相关的授课案例
  • 能够理解事件监听机制
  • 能够对按钮添加事件

1:API 概述

1.1 API概述和课程安排

来,继续啊,我们在讲解面向对象的时候,提到了学习面向对象重点就是学习两块内容:

1640156776779

第一块:学习如何自己设计对象并使用

第二块:学习获取已有对象并使用

而关于第一块知识:学习如何自己设计对象并使用,我们现在已经有一些基础了。

通过前面的学习呢,我们知道了如何定义类,并通过构造方法创建对象,然后通过对象使用成员变量和成员方法。

接下来,我们要学习的是第二块知识:获取已有对象并使用。而获取已有对象并使用呢,在Java中我们习惯称之为常用API的学习。

所以下面我们来学习常用API。首先,我们来说一下什么是API:

  • API(Application Programming Interface) :应用程序编程接口

那如何理解应用程序编程接口呢?这里我们通过下面的场景给大家解释一下。

看这里,我想编写一个机器人踢足球的程序,那么程序就要向机器人发出向前跑、向后跑、射门、抢球等各种命令。

1640156898821

如果我自己来编写呢,就会比较麻烦,因为机器人不是我设计的。所以,为了方便其他的开发者使用机器人,

机器人厂商呢就会提供一些用于控制机器人的类,这些类中会定义好操作机器人各种动作的方法。

有了这些类之后,开发一个机器人踢足球的程序就会非常的方便了。

其实,这些类就是机器人厂商提供给开发者的应用程序编程接口,而这些类我们称之为:API

知道了什么是API之后呢,我们来说一下,Java的API。

  • Java API :指的就是 JDK 中提供的各种功能的 Java类。

这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,

为了帮助我们使用这些类,Java还提供了对应的帮助文档。我们可以通过帮助文档来学习这些API如何使用

下面呢,我们一起来学习一下帮助文档的使用

要想使用帮助文档,首先我们得有一个帮助文档:来,打开课程资料下面,我们这里有一个帮助文档。

1640157051547

这个文档对应的是JDK11版本的,是目前比较新的中文版的帮助文档。

有了文档之后呢,我们来打开帮助文档。

文档打开后,找到索引这里,下面有一个输入框,在这个框框里输入我们要学习的API。

1640157126304

这里,我们拿字符串类做一个说明:在这个框框里面我们输入:String,然后一回车,看到一个新的界面

这个界面中,就是关于String相关的知识了。

1640157196012

接着,我们来说一下,在学习一个API的时候,我们重点要看四个地方:

第一个地方:看类所在的包

1640157257413

为什么要看这里呢,因为java.lang包下的类,我们是可以直接使用的,不需要导包。

其他包下的类,我们都是要导包后才能使用的,至于如何导包,下个知识我们会讲解。

很明显,String类在使用的时候,我们是不需要导包的。

第二个地方:看类的描述

也就是看这里,这里一般描述了类是干什么的。

1640157357609

比如说:String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。

告诉了我们String就是用来表示字符串的类,直接写一个字符串数据:abc就是String类的一个对象。

第三个地方:看类的构造方法

1640157422163

往下滑,这就是String类的构造方法,为什么要看构造方法呢?因为我们在使用一个类的时候,其实使用的是该类的对象,

而创建对象,我们是需要通过构造方法实现的,所以,我们得看看它提供了哪些构造方法。

这里的构造方法提供的比较多,至于用哪个,后面我们用到的时候再讲解,目前知道看哪里就行了

第四个地方:看类的成员方法

1640157499890

这是我们学习一个API的重点,我们之所以学习一个API,重点就是为了使用该API来完成某些功能。

而API的功能,都是通过一个个方法实现的,所以我们重点得看看类的成员方法。往下滑,这就是String提供的成员方法,有很多。

而一个方法,我们重点又看什么呢?回到第一个方法,我们说一下:

1640157613280

先看描述,通过描述,我们就知道了方法是干什么的。

再看方法名和参数,这样我们就知道调用哪个方法,以及参数的类型和个数。

最后,我们看返回值类型,这样我们就知道调用该方法后,最终给我们返回了一个什么类型结果

通过这些步骤,我们就知道了所学习的API该如何使用了,然后就可以到IDEA中去使用API了。

知道了帮助文档的使用步骤后,回到资料我们总结一下帮助文档的使用流程:

① 打开帮助文档

② 找到索引选项,输入要学习的API,然后回车

③ 看类所在包:因为java.lang包下的类在使用的时候不需要导包

④ 看类的描述:这样我们就知道了类是干什么的

⑤ 看类的构造方法:这样我们就可以创建对象了

⑥ 看类的成员方法:这样我们就可以通过这些方法完成某些功能了

知道了什么是API,以及通过帮助文档如何学习API后,我们来说一下常用API这部分内容的课程安排:

1640157673262

首先,我们学习一下包和导包的基本概念和操作,为API的使用做一个基础铺垫

接着我们来学习两个API:Scanner和Random

Scanner:是用来实现键盘录入数据的

Random:是用来产生随机数的

通过这两个API的学习,可以让我们熟悉帮助文档的使用

再接着我们来学习GUI相关的API,这里不是一个API的学习,而是多个API的学习,通过这部分内容的学习,可以让我们的操作可视化,也就是有界面了,不在仅仅是在控制台输出数据了。

最后,我们学习这几个API,学习这几个API的目的,是为了完成我们在GUI部分未完成的案例。

好了,到此关于API概述和常用API的课程安排我们就先讲到这里

1.2 包和导包

来,继续啊,下面我们来学习一下,包和导包。

那什么是包呢?

  • 包其实就是文件夹
  • 作用:对类进行分类管理

包的定义格式:

  • 格式:package 包名;
  • 注意:包名一般是公司域名反写,并且多级包用.分开
  • 举例:www.itheima.com
  • 范例:package com.itheima;

知道了如何定义包之后,下面我们来定义两个包,并且在不同包下定义同名的类。

package com.itheima_01;

public class Student {
    public void study() {
        System.out.println("好好学习天天向上");
    }
}

package com.itheima_01;

public class StudentTest {
    public static void main(String[] args) {
        Student s = new Student();
        s.study();
    }
}
package com.itheima_02;

public class StudentTest {
    public static void main(String[] args) {
        com.itheima_01.Student s = new com.itheima_01.Student();
        s.study();

        com.itheima_01.Student s2 = new com.itheima_01.Student();
        s2.study();
    }
}

在这里我们讲解了同一个包下类的使用,以及不同包下类的使用。发现不同包下类的使用太麻烦了,所以,这个时候,我们就要学习一下导包了。

使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了。

为了简化带包的操作,Java就提供了导包的功能。

导包的格式:

  • 格式:import 包名;
  • 范例:import com.itheima.Student;

知道了如何导包后,我们再来修改一下不同包下类的使用代码:

package com.itheima_02;

import com.itheima_01.Student;
//Alt+Enter 快捷键导包

public class StudentTest {
    public static void main(String[] args) {
        Student s = new Student();
        s.study();

        Student s2 = new Student();
        s2.study();


//        com.itheima_01.Student s = new com.itheima_01.Student();
//        s.study();
//
//        com.itheima_01.Student s2 = new com.itheima_01.Student();
//        s2.study();
    }
}

在这里我们讲解了导包的三种方式:

  1. 手动导包
  2. 快捷键导包
  3. 写一个类,写一部分的时候,如果给出了对应的提示,回车后会自动导包

讲解完毕后,大家赶快动手练习一下吧。

2:Scanner

2.1 Scanner基本使用

了解了API相关的知识后,下面我们来学习一下Scanner的使用。

通过查看帮助文档,我们知道了如下的信息:

Scanner:

  • 一个简单的文本扫描程序,可以获取基本类型数据和字符串数据

构造方法:

  • Scanner(InputStream source):创建 Scanner 对象
  • System.in:对应的是InputStream类型,可以表示键盘输入
  • Scanner sc = new Scanner(System.in);

成员方法:

  • int nextInt():获取一个int类型的数据
  • int i = sc.nextInt();

知道了Scanner的构造方法和成员方法后,我们到IDEA中去使用一下:

import java.util.Scanner;

/*
    Scanner的基本使用
 */
public class ScannerDemo {
    public static void main(String[] args) {
        //Scanner(InputStream source):创建 Scanner 对象
        Scanner sc = new Scanner(System.in);

        //int nextInt():获取一个int类型的数据
        System.out.println("请输入一个整数:");
        int i = sc.nextInt();

        //输出获取到的数据
        System.out.println("你输入的数据是:" + i);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

2.2 练习(数据求和)

需求:键盘录入两个整数,求两个数据和,并在控制台输出求和结果

首先,我们来简单的分析一下:

分析:

① 创建键盘录入数据对象

② 通过键盘录入数据对象调用nextInt()方法获取数据

③ 对获取的两个整数求和

④ 在控制台输出求和结果

分析完毕后,我们到IDEA中去实现一下:

/*
    需求:键盘录入两个整数,求两个数据和,并在控制台输出求和结果
    分析:
        1:创建键盘录入数据对象
        2:通过键盘录入数据对象调用nextInt()方法获取数据
        3:对获取的两个整数求和
        4:在控制台输出求和结果
 */
public class ScannerTest {
    public static void main(String[] args) {
        //创建键盘录入数据对象
        Scanner sc = new Scanner(System.in);

        //通过键盘录入数据对象调用nextInt()方法获取数据
        System.out.println("请输入第一个整数:");
        int firstNumber = sc.nextInt();

        System.out.println("请输入第二个整数:");
        int secondNumber = sc.nextInt();

        //对获取的两个整数求和
        int sum = firstNumber + secondNumber;

        //在控制台输出求和结果
        System.out.println("求和结果是:" + sum);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

3:Random

3.1 Random基本使用

来,继续啊,下面我们来学习一下Random的使用。

通过查看帮助文档,我们知道了如下的信息:

Random:

  • 该类的实例用于生成随机数

构造方法:

  • Random():创建一个新的随机数生成器

成员方法:

  • int nextInt(int bound):获取一个int类型的随机数,参数bound表示获取到的随机数在[0,bound)之间

知道了Random的构造方法和成员方法后,我们到IDEA中去使用一下:

import java.util.Random;

/*
    Random的基本使用
 */
public class RandomDemo {
    public static void main(String[] args) {
        //Random():创建一个新的随机数生成器
        Random r = new Random();

        //int nextInt(int bound):获取一个int类型的随机数,参数bound表示获取到的随机数在[0,bound)之间
//        int i = r.nextInt(10);
//        System.out.println(i);

//        for (int i=1; i<=10; i++) {
//            int j = r.nextInt(10);
//            System.out.println(j);
//        }

        //需求:如何获取1-100之间的随机数呢?
//        int number = r.nextInt(100);//0-99
//        int number = r.nextInt(101);//0-100
        int number = r.nextInt(100) + 1;
        System.out.println(number);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

3.2 练习(猜数字游戏)

需求:系统自动产生一个1-100之间的整数,使用程序实现猜这个数字是多少?

猜的时候根据不同情况给出相应的提示

如果猜的数字比真实数字大,提示你猜的数据大了

如果猜的数字比真实数字小,提示你猜的数据小了

如果猜的数字与真实数字相等,提示恭喜你猜中了

首先,我们来简单的分析一下:

分析:

① 使用Random获取一个1-100之间的整数

② 使用Scanner实现键盘录入猜的数据值

③ 使用if…else if…else 的格式实现猜数字,并给出对应的提示

分析完毕后,我们到IDEA中去实现一下:

import java.util.Random;
import java.util.Scanner;

/*
    需求:系统自动产生一个1-100之间的整数,使用程序实现猜这个数字是多少?
        猜的时候根据不同情况给出相应的提示
        如果猜的数字比真实数字大,提示你猜的数据大了
        如果猜的数字比真实数字小,提示你猜的数据小了
        如果猜的数字与真实数字相等,提示恭喜你猜中了
    分析:
        1:使用Random获取一个1-100之间的整数
        2:使用Scanner实现键盘录入猜的数据值
        3:使用if…else if…else 的格式实现猜数字,并给出对应的提示
 */
public class RandomTest {
    public static void main(String[] args) {
        //使用Random获取一个1-100之间的整数
        Random r = new Random();
        int number = r.nextInt(100) + 1;
        System.out.println("系统已经产生了一个1-100之间的整数");

        while (true) {
            //使用Scanner实现键盘录入猜的数据值
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你要猜的数字:");
            int guessNumber = sc.nextInt();

            //使用if…else if…else 的格式实现猜数字,并给出对应的提示
            if (guessNumber > number) {
                System.out.println("你猜的数据" + guessNumber + "大了");
            } else if (guessNumber < number) {
                System.out.println("你猜的数据" + guessNumber + "小了");
            } else {
                System.out.println("恭喜你猜中了");
                break;
            }
        }
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4:GUI

4.1 GUI概述

来,继续啊,下面呢我们来学习GUI相关的API。

首先呢,我们来说一下,什么是GUI:

  • GUI Graphical User Interface(图形用户接口)
  • 用图形的方式,来显示计算机操作的界面

怎么理解呢?我们把后面要做的案例拿来举例说明一下:

看这里:

1640158945337

这是用户登录的案例,在这个界面上,有显示文本的标签,显示输入内容的文本框以及按钮。

再来看一个:

1640158964252

聊天室的案例,在这个界面上,有显示聊天内容的文本域,显示输入内容的文本框以及操作的按钮。

给出这样的界面,我们自己就能够看明白,非常的方便直观,这就是使用GUI相关的API来实现的。

而Java为GUI提供的API都存在java.awt和javax.Swing两个包中,我们分别来看一下这两个包:

  • java.awt 包:
    • awt是这三个单词首字母的缩写,翻译过来是抽象窗口工具包,只不过这个包的API,需要调用本地系统方法实现功能,和本地系统有关联,不利于代码移植,属重量级控件
  • javax.swing 包:
    • 它是在awt的基础上,建立的一套图形界面系统,提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件

所以,我们做图形界面开发使用的是swing包下的类。

这里出现了一个名词:组件。那什么是组件呢?

  • 组件是具有图形表示的对象,该图形表示可以显示在屏幕上并且可以与用户交互

比如说,在用户登录中,文本框和按钮等,都是能够表示图形的对象,所以它们都称为组件。

最后,我们来说一下,我们会用到的常用组件,

看这里:

1640159115023

组件:

  • **基本组件:**具有图形表示的对象
  • **容器组件:**是可以添加组件的组件。也就是在容器中可以通过add方法添加组件,既可以添加基本组件,也可以添加容器组件。

我们先来看常用的基本组件:

  • JButton,这是按钮

  • JLabel,这是用来显示文本内容的,或者展示图片使用

  • JTextFile,这是文本框,用来输入内容的

  • JTextArea,这是文本域,用来输入多行多列的数据的

接着,我们再来看容器组件:

  • 面板也是一个容器,我们常用JPanel,后面用到在具体讲解
  • 窗体,下面是Frame,这是awt包下,而我们使用的是JFrame,这是swing包下。

看到这里,我要说一下,由于我们使用的都是swing包下的,所以将来使用的组件,都是以J开头的。

好了,GUI相关的基础知识我们就先讲到这里

4.2 常用组件

4.2.1 JFrame(初识窗体)

来,继续啊,下面我们来学习JFrame窗体类。

在学习JFrame之前,先说一下,在学习GUI相关的API的时候,我就不带着大家到帮助文档中查看了。

在资料中,我们会把要讲解的类的作用,构造方法,和成员方法给大家展示出来,简单的分析后,到IDEA中去实现。

首先,我们来看一下JFrame:

JFrame:

  • 是一个顶层窗口

构造方法:

  • JFrame():构造一个最初不可见的新窗体

成员方法:

  • void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
  • void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素

知道了JFrame的构造方法和成员方法后,我们到IDEA中去使用一下:

import javax.swing.*;

/*
    构造方法
        JFrame():构造一个最初不可见的新窗体

    成员方法
        void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
        void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素
 */
public class JFrameDemo01 {
    public static void main(String[] args) {
        //JFrame():构造一个最初不可见的新窗体
        JFrame jf = new JFrame();

        //void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素
        jf.setSize(400,300);

        //void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.2.2 JFrame(常用设置)

来,继续啊,下面呢,我们再来学习几个JFrame窗体的常用方法:

  • void setTitle(String title):设置窗体标题
  • void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
  • void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作
    • 整数3表示:窗口关闭时退出应用程序
  • void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上

了解了这几个方法后,我们到IDEA中去使用一下:

import javax.swing.*;

/*
    void setTitle(String title):设置窗体标题
    void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
    void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作(整数3表示:窗口关闭时退出应用程序)
    void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上
 */
public class JFrameDemo02 {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        //void setTitle(String title):设置窗体标题
        jf.setTitle("百度一下,你就知道");
        //设置窗体大小
        jf.setSize(400, 300);
        //void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作(整数3表示:窗口关闭时退出应用程序)
        jf.setDefaultCloseOperation(3);
        //void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
        jf.setLocationRelativeTo(null);
        //void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上
        jf.setAlwaysOnTop(true);

        //设置窗体可见
        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.2.3 JButton(窗口中添加按钮)

来,继续啊,下面我们来学习JButton,它是按钮的实现。

JButton:

  • 按钮的实现

构造方法:

  • JButton(String text):创建一个带文本的按钮

成员方法:

  • void setSize(int width, int height):设置大小
  • void setLocation(int x, int y):设置位置(x坐标,y坐标)

知道了JButton的构造方法和成员方法后,我们到IDEA中去使用一下:

import javax.swing.*;

/*
    构造方法
        JButton(String text):创建一个带文本的按钮

    成员方法
        void setSize(int width, int height):设置大小
        void setLocation(int x, int y):设置位置(x坐标,y坐标)
 */
public class JButtonDemo {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("窗口中添加按钮");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null); //取消窗体的默认布局

        //JButton(String text):创建一个带文本的按钮
        JButton btn = new JButton("我是按钮");
//        //void setSize(int width, int height):设置大小
//        btn.setSize(100,20);
//        //void setLocation(int x, int y):设置位置(x坐标,y坐标)
        btn.setLocation(0,0);
//        btn.setLocation(100,100);
        btn.setBounds(100,100,100,20);

        JButton btn2 = new JButton("我是按钮2");
        btn2.setBounds(100,120,100,20);

        jf.add(btn);
        jf.add(btn2);

        //设置窗体可见
        jf.setVisible(true);
    }
}

演示完毕之后,回到资料再总结一下:

JButton:

  • 按钮的实现

构造方法:

  • JButton(String text):创建一个带文本的按钮

成员方法:

  • void setSize(int width, int height):设置大小

  • void setLocation(int x, int y):设置位置(x坐标,y坐标)

  • void setBounds(int x, int y, int width, int height):设置位置和大小

和窗体相关操作:

  • 取消窗体默认布局:窗体对象.setLayout(null);
  • 把按钮添加到窗体:窗体对象.add(按钮对象);

讲解完毕后,大家赶快动手练习一下吧。

4.2.4 JLabel(显示文本和图像)

来,继续啊,下面呢,我们来学习JLable,它是用来做短文本字符串或图像的显示的。

JLable:

  • 短文本字符串或图像的显示区域

构造方法:

  • JLabel(String text):使用指定的文本创建 JLabel实例
  • JLabel(Icon image):使用指定的图像创建 JLabel实例
    • ImageIcon(String filename):从指定的文件创建ImageIcon
    • 文件路径:绝对路径和相对路径
    • 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件
      • 例如:D:\IdeaProjects\javase_code\itheima-api-gui\images\mn.png
    • 相对路径:必须使用取自其他路径名的信息进行解释
      • 例如:itheima-api-gui\images\mn.png

成员方法:

  • void setBounds(int x, int y, int width, int height):设置位置和大小

知道了JLabel的构造方法和成员方法后,我们到IDEA中去使用一下:

import javax.swing.*;

/*
    构造方法
        JLabel(String text):使用指定的文本创建 JLabel实例
        JLabel(Icon image):使用指定的图像创建 JLabel实例
            ImageIcon(String filename):从指定的文件创建ImageIcon
    成员方法
        void setBounds(int x, int y, int width, int height):设置位置和大小
 */
public class JLabelDemo {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("显示文本和图像");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //JLabel(String text):使用指定的文本创建 JLabel实例
        JLabel jLabel = new JLabel("好好学习");
        jLabel.setBounds(0,0,100,20);

        //JLabel(Icon image):使用指定的图像创建 JLabel实例
        //ImageIcon(String filename):从指定的文件创建ImageIcon
        //D:\IdeaProjects\javase_code\itheima-api-gui\images\mn.png
//        ImageIcon imageIcon = new ImageIcon("D:\\IdeaProjects\\javase_code\\itheima-api-gui\\images\\mn.png");
//        JLabel jLabel2 = new JLabel(imageIcon);
//        JLabel jLabel2 = new JLabel(new ImageIcon("D:\\IdeaProjects\\javase_code\\itheima-api-gui\\images\\mn.png"));
        JLabel jLabel2 = new JLabel(new ImageIcon("itheima-api-gui\\images\\mn.png"));
        jLabel2.setBounds(50,50,100,143);

        jf.add(jLabel);
        jf.add(jLabel2);

        //设置窗体可见
        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

注意:在实际开发中,大家不用担心每个组件的位置和大小。因为这些都是前端人员设计好的。

4.3 案例

来,继续啊,下面呢,我们通过几个案例,来使用一下GUI中的常用组件。目前呢,我们仅仅是把界面做出来,下一次课呢,我们就要把最终的功能给实现了。首先,我们来看第一个案例。

4.3.1 案例1(用户登录)

需求:如图所示,做出界面

提示:给出的数据就是按照组件位置和大小给出的

1640160198618

首先,我们来简单的分析一下:

分析:

① 2个JLabel

② 2个JTextField

③ 1个JButton

分析完毕后,我们到IDEA中去实现一下:

import javax.swing.*;

/*
    用户登录
 */
public class UserLogin {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("用户登录");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示用户名文本
        JLabel usernameLable = new JLabel("用户名");
        usernameLable.setBounds(50,50,50,20);
        jf.add(usernameLable);

        //用户名输入框
        JTextField usernameField = new JTextField();
        usernameField.setBounds(150,50,180,20);
        jf.add(usernameField);

        //显示密码文本
        JLabel passwordLable = new JLabel("密码");
        passwordLable.setBounds(50,100,50,20);
        jf.add(passwordLable);

        //密码输入框
//        JTextField passwordField = new JTextField();
//        passwordField.setBounds(150,100,180,20);
//        jf.add(passwordField);

        JPasswordField passwordField = new JPasswordField();
        passwordField.setBounds(150,100,180,20);
        jf.add(passwordField);

        //登录按钮
        JButton loginButton = new JButton("登录");
        loginButton.setBounds(50,200,280,20);
        jf.add(loginButton);

        jf.setVisible(true);
    }
}

在讲解的过程中,引入了一个新的组件JPasswordField,用来表示密码框。

讲解完毕后,大家赶快动手练习一下吧。

4.3.2 案例2(聊天室)

需求:如图所示,做出界面

提示:给出的数据就是按照组件位置和大小给出的

1640160345308

首先,我们来简单的分析一下:

分析:

① 1个JTextArea

② 1个JTextField

③ 2个JButton

分析完毕后,我们到IDEA中去实现一下:

import javax.swing.*;

/*
    聊天室
 */
public class ChatRoom {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("聊天室");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示聊天信息的文本域
        JTextArea messageArea = new JTextArea();
        messageArea.setBounds(10,10,360,200);
        jf.add(messageArea);

        //输入聊天信息的文本框
        JTextField messageField = new JTextField();
        messageField.setBounds(10,230,180,20);
        jf.add(messageField);

        //发送按钮
        JButton sendButton = new JButton("发送");
        sendButton.setBounds(200,230,70,20);
        jf.add(sendButton);

        //清空聊天按钮
        JButton clearButton = new JButton("清空聊天");
        clearButton.setBounds(280,230,100,20);
        jf.add(clearButton);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.3.3 案例3(猜数字)

需求:如图所示,做出界面

提示:给出的数据就是按照组件位置和大小给出的

1640160399176

首先,我们来简单的分析一下:

分析:

① 1个JLabel

② 1个JTextField

③ 1个JButton

分析完毕后,我们到IDEA中去实现一下:

import javax.swing.*;

/*
    猜数字
 */
public class GuessNumber {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("猜数字");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //提示信息
        JLabel messageLable = new JLabel("系统产生了一个1-100之间的数据,请猜一猜");
        messageLable.setBounds(70,50,350,20);
        jf.add(messageLable);

        //输入要猜的数字
        JTextField numberField = new JTextField();
        numberField.setBounds(120,100,150,20);
        jf.add(numberField);

        //猜数字的按钮
        JButton guessButton = new JButton("我猜");
        guessButton.setBounds(150,150,100,20);
        jf.add(guessButton);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.3.4 案例4(手机日期和时间显示)

需求:如图所示,做出界面

提示:给出的数据就是按照组件位置和大小给出的

参照图:

1640160482727

我们要实现的图:

1640160461955

首先,我们来简单的分析一下:

分析:

① 4个JLabel

分析完毕后,我们到IDEA中去实现一下:

import javax.swing.*;

/*
    手机日期和时间显示
 */
public class ShowDateTime {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("手机日期和时间显示");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //提示日期
        JLabel dateLable = new JLabel("日期");
        dateLable.setBounds(50,50,100,20);
        jf.add(dateLable);

        //按照格式显示日期的字符串
        JLabel showDateLable = new JLabel("xxxx年xx月xx日");
        showDateLable.setBounds(50,80,200,20);
        jf.add(showDateLable);

        //提示时间
        JLabel timeLable = new JLabel("时间");
        timeLable.setBounds(50,150,100,20);
        jf.add(timeLable);

        //按照格式显示时间的字符串
        JLabel showTimeLable = new JLabel("xx:xx");
        showTimeLable.setBounds(50,180,200,20);
        jf.add(showTimeLable);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.3.5 案例5(考勤查询)

需求:如图所示,做出界面

提示:给出的数据就是按照组件位置和大小给出的

1640160575426

首先,我们来简单的分析一下:

分析:

① 3个JLabel

② 2个JTextField

③ 1个JButton

分析完毕后,我们到IDEA中去实现一下:

import javax.swing.*;

/*
    考勤查询
 */
public class AttendanceQuery01 {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("考勤查询");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示考勤日期的文本
        JLabel dateLable = new JLabel("考勤日期");
        dateLable.setBounds(50,20,100,20);
        jf.add(dateLable);

        //显示开始时间文本
        JLabel startDateLable = new JLabel("开始时间");
        startDateLable.setBounds(50,70,100,20);
        jf.add(startDateLable);

        //开始时间输入框
        JTextField startDateField = new JTextField();
        startDateField.setBounds(50,100,100,20);
        jf.add(startDateField);

        //显示结束时间文本
        JLabel endDateLable = new JLabel("结束时间");
        endDateLable.setBounds(250,70,100,20);
        jf.add(endDateLable);

        //结束时间输入框
        JTextField endDateField = new JTextField();
        endDateField.setBounds(250,100,100,20);
        jf.add(endDateField);

        //确定按钮
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(250,180,60,20);
        jf.add(confirmButton);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.3.6 案例5(考勤查询之日历控件)

需求:用日历控件改进考勤查询的日期字符串填写

来,继续啊,下面我们来学习考勤查询之日历控件

首先,我们看一下需求:用日历控件改进考勤查询的日期字符串填写

什么意思呢?我们刚在做的考勤查询系统,是需要手动输入日期字符串的,而在实际开发中,我们一般会选择使用日历控件来实现,

也就是下面这个样子的,我们点击一下,就会出现日历控件,我们选择日期就可以了。

1640160765732

这个相信大家有见过。

知道了要做什么之后,下面我们来说一下,怎么做。

我们可以自己写这个日历控件,也可以使用别人写好的日历控件。鉴于目前所学知识有限,我们先使用别人提供的日历控件。

这里呢,我准备好了一个日历控件类(DateChooser.java),我们到IDEA中一起去看一下如何使用:

public static void main(String[] args) {
    //创建窗体
    JFrame jf = new JFrame();

    //设置窗体大小
    jf.setSize(400, 300);
    //设置窗体标题
    jf.setTitle("日历控件");
    //设置位置,值为null,则窗体位于屏幕中央
    jf.setLocationRelativeTo(null);
    //设置窗体关闭时默认操作,窗口关闭时退出应用程序
    jf.setDefaultCloseOperation(3);
    //设置此窗口是否应始终位于其他窗口之上
    jf.setAlwaysOnTop(true);
    //取消窗体默认布局:窗体对象.setLayout(null);
    jf.setLayout(null);

    //创建日期选择器对象,指定日期字符串格式
    DateChooser dateChooser = DateChooser.getInstance("yyyy-MM-dd");

    JTextField showDateField = new JTextField("单击选择日期");
    showDateField.setBounds(50, 50, 100, 20);

    //把日历控件和文本框进行绑定
    dateChooser.register(showDateField);

    jf.add(showDateField);

    jf.setVisible(true);
}

了解了如何使用日历控件后,我们把开始写的代码改进一下:

import javax.swing.*;

/*
    考勤查询
 */
public class AttendanceQuery02 {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("考勤查询");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示考勤日期的文本
        JLabel dateLable = new JLabel("考勤日期");
        dateLable.setBounds(50,20,100,20);
        jf.add(dateLable);

        //显示开始时间文本
        JLabel startDateLable = new JLabel("开始时间");
        startDateLable.setBounds(50,70,100,20);
        jf.add(startDateLable);

        DateChooser dateChooser1 = DateChooser.getInstance("yyyy/MM/dd");
        DateChooser dateChooser2 = DateChooser.getInstance("yyyy/MM/dd");
        //开始时间输入框
        JTextField startDateField = new JTextField();
        startDateField.setBounds(50,100,100,20);
        dateChooser1.register(startDateField);
        jf.add(startDateField);

        //显示结束时间文本
        JLabel endDateLable = new JLabel("结束时间");
        endDateLable.setBounds(250,70,100,20);
        jf.add(endDateLable);

        //结束时间输入框
        JTextField endDateField = new JTextField();
        endDateField.setBounds(250,100,100,20);
        dateChooser2.register(endDateField);
        jf.add(endDateField);

        //确定按钮
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(250,180,60,20);
        jf.add(confirmButton);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

4.4 事件监听机制

来,继续啊,目前呢,我们做好了几个GUI的界面,但是具体的功能,我们没法实现。因为要想实现功能,就必须要学习一下事件监听机制。

这里,我们一起来说一下事件监听机制的组成:

  • **事件源:**事件发生的地方。可以是按钮,窗体,图片等
  • **事件:**发生了什么事情。例如:鼠标点击事件,键盘按下事件等
  • **事件绑定:**把事件绑定到事件源上,当发生了某个事件,则触发对应的处理逻辑
    • 事件源对象. addXXXListener(事件);

GUI中的事件比较多,这里呢,我们先告诉一下大家如何给按钮添加事件,能够把我们前面的案例给实现就可以了。至于其他事件,后面我们用到的时候再去学习。

1640161060785

了解了如何给按钮添加事件后,我们到IDEA中去体验一下:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
    事件监听机制
 */
public class ActionListenerDemo {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("事件监听机制");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //创建按钮
        JButton jButton = new JButton("你点我啊");
        jButton.setBounds(0, 0, 100, 100);
        jf.add(jButton);

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("你点我啊");
            }
        });

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

1 编程题

1.1 视频中的案例

​ 视频中的案例如果有没练习的,先补上

1.2 编程题一

训练目标:Scanner的使用,方法的定义和使用

需求描述:用户在控制台输入行数和列数,然后定义一个带参方法实现输出对应矩形

image-20220315192436419

public class Test01 {
    public static void main(String[] args) {
        //键盘对象
        Scanner sc = new Scanner(System.in);
        //提示并接收
        System.out.println("行:");
        int hang = sc.nextInt();
        System.out.println("列:");
        int lie = sc.nextInt();
        //外管行
        for (int i = 1; i <= hang; i++) {
            //内管列
            for (int j = 1; j <= lie; j++) {
                //一行打印
                System.out.print("#");
            }
            //一列走完换行
            System.out.println();
        }
    }
}

1.3 编程题二

训练目标:键盘对象Scanner的使用, 方法的复习

需求描述:设计一个方法, 可以获取一个指定长度的数组, 数组元素为键盘录入的整数

public class Test02 {
    public static void main(String[] args) {
        //调用方法
        int[] arr = getScannerArray(5);
        //查看结果
        System.out.println("遍历数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    /*
        定义方法的两个明确:
            1.参数列表: int 长度
            2.返回值类型: int[]
     */
    public static int[] getScannerArray(int length){
        //动态初始化指定长度的数组
        int[] arr = new int[length];
        //创建键盘对象
        Scanner sc= new Scanner(System.in);
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            //提示录入
            System.out.println("请输入第"+(i+1)+"个元素:");
            //给元素赋值
            arr[i] = sc.nextInt();
        }
        //返回数组
        return arr;
    }
}

1.4 编程题三

训练目标:随机数对象Random的使用, 方法的复习

需求描述:设计一个方法, 可以获取一个指定长度的数组, 数组元素为指定范围的整数

public class Test03 {
    public static void main(String[] args) {
        //调用方法
        int[] arr = getRandomArray(5,1,10);
        //查看结果
        System.out.println("随机数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        定义方法的两个明确:
            1.参数列表: int 长度, int 随机数起始范围, int 随机数结束范围
            2.返回值类型: int[]
     */
    public static int[] getRandomArray(int length, int min, int max) {
        //动态初始化指定长度的数组
        int[] arr = new int[length];
        //创建随机数对象
        Random r = new Random();
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            //给元素赋随机值, 范围是用户指定的
            arr[i] = r.nextInt(max - min + 1) + min;
        }
        //返回数组
        return arr;
    }
}

常用API(2)

今日目标:

  • 能够使用String类的功能完成用户登录案例
  • 能够使用String类的功能完成聊天室案例
  • 能够使用Integer类的功能完成猜数字案例
  • 能够使用Date类和SimpleDateFormat类的功能完成手机日期和时间显示案例
  • 能够使用Date类和SimpleDateFormat类的功能完成考勤查询案例

1:String

1.1 String(构造方法)

来,继续啊,前面我们做过了GUI中的案例,也就是把一些小应用的界面做好了,但是具体功能并没有实现。接下来呢,我们就来一起实现一下。

首先,我们先来学习String类,它涉及到两个案例:用户登录和聊天室。

先来看用户登录案例:需要输入用户名和密码,和已知的用户名和密码进行比较,涉及到比较的方法,

一般来说,用户名和密码的长度可能会有一定限制,涉及到获取字符串长度的方法,

1640164265984

再来看聊天室案例,这里输入聊天的内容,然后把聊天内容显示到上面的文本域。

在聊天的时候,可能不小心打了空格,我们不需要的,需要去掉前后空格,

1640164272200

当然了,还有很多其他的成员方法,只不过,目前我们暂时用不上,后面用的时候再讲。

下面,我们就来学习一下字符串类String,最后完成用户登录案例和聊天室案例。

而关于String类呢,我们先到帮助文档中去查看,然后回来总结,最后到IDEA中去演示。

来,打开我们准备好的帮助文档,关于通过帮助文档查看String,大家按照老师讲解的API的使用步骤看看即可。

通过文档了解了String类之后,下面我们回到资料中总结一下:

String:

  • String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例

构造方法:

  • String():初始化新创建的 String对象,使其表示空字符序列
  • String(String original):初始化新创建的String对象,使其表示与参数相同的字符序列

知道了String的构造方法后,我们到IDEA中去使用一下:

/*
    String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例

    构造方法:
        String():初始化新创建的 String对象,使其表示空字符序列
        String(String original):初始化新创建的String对象,使其表示与参数相同的字符序列
 */
public class StringDemo01 {
    public static void main(String[] args) {
        //String():初始化新创建的 String对象,使其表示空字符序列
        String s1 = new String();
        System.out.println(s1);
        //int length() 返回此字符串的长度
        System.out.println(s1.length());
        System.out.println("------------");

        //String(String original):初始化新创建的String对象,使其表示与参数相同的字符序列
        String s2 = new String("itheima");
        System.out.println(s2);
        System.out.println(s2.length());
        System.out.println("------------");

        //Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例
        String s3 = "itheima";
        System.out.println(s3);
        System.out.println(s3.length());
    }
}

讲解完毕后,大家赶快动手练习一下吧。

1.2 String(成员方法)

来,继续啊,下面我们来学习String类中常用的成员方法:

  • int length():返回此字符串的长度
  • boolean equals(Object anObject):将此字符串与指定的对象进行比较
  • boolean equalsIgnoreCase(String anotherString):将此 String与另一个 String比较,忽略了大小写
  • String trim():返回一个字符串,其值为此字符串,删除了所有前导和尾随空格

而关于这几个成员方法呢,我们到IDEA中一边使用,一边讲解。

/*
    int length():返回此字符串的长度
    boolean equals(Object anObject):将此字符串与指定的对象进行比较
    boolean equalsIgnoreCase(String anotherString):将此 String与另一个 String比较,忽略了大小写
    String trim():返回一个字符串,其值为此字符串,删除了所有前导和尾随空格
 */
public class StringDemo02 {
    public static void main(String[] args) {
        String s1 = "itheima";
        String s2 = "itheima";
        String s3 = "Itheima";

        //boolean equals(Object anObject):将此字符串与指定的对象进行比较
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));

        //boolean equalsIgnoreCase(String anotherString):将此 String与另一个 String比较,忽略了大小写
        System.out.println(s1.equalsIgnoreCase(s2));
        System.out.println(s1.equalsIgnoreCase(s3));
        System.out.println("-------------------");

        String s4 = " itheima ";
        //String trim():返回一个字符串,其值为此字符串,删除了所有前导和尾随空格
        System.out.println(s4);
        System.out.println(s4.trim());

        String s5 = "it heima";
        System.out.println(s5.trim());
    }
}

讲解完毕后,大家赶快动手练习一下吧。

1.3 GUI案例1(用户登录实现)

需求:根据下列要求,完成用户登录的逻辑,并给出相应的提示

1640164638518

要求:

① 已知的用户名和密码

用户名:itheima

密码:123456

② 用户名和密码的长度都是6-12位

③ 点击登录按钮

先判断输入的用户名和密码是否符合要求

再判断用户登录是否成功

知道了用户登录案例的需求和要求后,下面我们到IDEA中去实现一下:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
    1:已知的用户名和密码
        用户名:itheima
       密码:123456
    2:用户名和密码的长度都是6-12位
    3:点击登录按钮
       先判断输入的用户名和密码是否符合要求
       再判断用户登录是否成功
 */
public class UserLogin {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("用户登录");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示用户名文本
        JLabel usernameLable = new JLabel("用户名");
        usernameLable.setBounds(50, 50, 50, 20);
        jf.add(usernameLable);

        //用户名输入框
        JTextField usernameField = new JTextField();
        usernameField.setBounds(150, 50, 180, 20);
        jf.add(usernameField);

        //显示密码文本
        JLabel passwordLable = new JLabel("密码");
        passwordLable.setBounds(50, 100, 50, 20);
        jf.add(passwordLable);

        //密码输入框
        JPasswordField passwordField = new JPasswordField();
        passwordField.setBounds(150, 100, 180, 20);
        jf.add(passwordField);

        //登录按钮
        JButton loginButton = new JButton("登录");
        loginButton.setBounds(50, 200, 280, 20);
        jf.add(loginButton);

        //已知的用户名和密码
        String name = "itheima";
        String pwd = "123456";

        loginButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取用户输入的用户名和密码
                String username = usernameField.getText();
                String password = passwordField.getText();

                //先判断输入的用户名和密码是否符合要求
                //用户名和密码的长度都是6-12位
                if(username.length()<6 || username.length()>12) {
//                    System.out.println("用户名的长度是6-12位,请重新输入");
                    //静态的成员方法和成员变量是可以通过类名访问的
                    JOptionPane.showMessageDialog(jf,"用户名的长度是6-12位,请重新输入");
                    usernameField.setText("");
                    return;
                }

                //再判断用户登录是否成功
                if(username.equals(name) && password.equals(pwd)) {
//                    System.out.println("登录成功");
                    JOptionPane.showMessageDialog(jf,"登录成功");
                    usernameField.setText("");
                    passwordField.setText("");
                } else {
//                    System.out.println("用户名或者密码有误");
                    JOptionPane.showMessageDialog(jf,"用户名或者密码有误");
                }
            }
        });

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

1.4 GUI案例2(聊天室实现)

需求:根据下列要求,完成聊天室的逻辑

1640164718346

要求:

① 把文本框的内容发送到文本域中

② 每次发送的文本内容不带前后空格

③ 多次发送的内容在文本域以追加的方式呈现

④ 清空聊天就是把文本域的内容设置为空

知道了聊天室案例的需求和要求后,下面我们到IDEA中去实现一下:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
    1:把文本框的内容发送到文本域中
    2:每次发送的文本内容不带前后空格
    3:多次发送的内容在文本域以追加的方式呈现
    4:清空聊天就是把文本域的内容设置为空
 */
public class ChatRoom {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("聊天室");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示聊天信息的文本域
        JTextArea messageArea = new JTextArea();
        messageArea.setBounds(10, 10, 360, 200);
        jf.add(messageArea);

        //输入聊天信息的文本框
        JTextField messageField = new JTextField();
        messageField.setBounds(10, 230, 180, 20);
        jf.add(messageField);

        //发送按钮
        JButton sendButton = new JButton("发送");
        sendButton.setBounds(200, 230, 70, 20);
        jf.add(sendButton);

        //清空聊天按钮
        JButton clearButton = new JButton("清空聊天");
        clearButton.setBounds(280, 230, 100, 20);
        jf.add(clearButton);

        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本框的内容
//                String message = messageField.getText();
//                messageField.setText("");

                //每次发送的文本内容不带前后空格
//                String message = messageField.getText();
//                message = message.trim();
                String message = messageField.getText().trim(); //链式调用
                messageField.setText("");


                //把文本框的内容发送到文本域中
//                messageArea.setText(message);
                //多次发送的内容在文本域以追加的方式呈现
                messageArea.append(message+"\n");
            }
        });

        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //清空聊天就是把文本域的内容设置为空
                messageArea.setText("");
            }
        });

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

2:Integer

2.1 Integer(构造方法)

来,继续啊,下面我们来学习基本类型包装类,它涉及到1个案例:猜数字。

1640164796396

来,我们一起看一下,在这个输入框里,我们要输入一个猜的数据,然后点击我猜这个按钮,和已经产生的数据进行比对,给出相应的提示即可。

而且呢,猜数字案例的基本逻辑,我们前面是讲解过的,只不过当时使用的是键盘录入数据,而这里我们采用的是在输入框里输入数据而已。

那我们为什么要学习基本类型包装类呢?

因为,在输入框里输入的数据,我们得到的是一个字符串数据,而实际比较的时候我们需要的是一个int类型的数据,所以,我们得想办法把字符串数据转换为int类型的数据。

为了实现这个效果,Java就提供了基本类型包装类供我们使用。所以,我们说,将基本数据类型封装成对象的好处就是可以通过对象调用方法操作数据。

而我们常用的操作之一呢:就是用于基本数据类型与字符串之间的转换。

在这里呢,我们一起来看一下,八种基本数据类型和其对应的包装类类型

1640164856732

从名字上看,包装类类型就是把基本类型的第一个单词改为大写即可。

当然,这里也有两个比较特殊的,一个是int类型的包装类,一个是字符类型的包装类,它们的包装类名称是这个样子的,大家了解一下即可。

下面呢,我们以Integer举例来讲解字符串和int类型之间的相互转换,其他基本类型和字符串的转换方式类似,在使用的时候,大家参照Integer的使用即可。

而关于Integer类的学习呢,我们先到帮助文档中去查看,然后回来总结,最后到IDEA中去演示。

来,打开我们准备好的帮助文档,关于通过帮助文档查看Integer,大家按照老师讲解的API的使用步骤看看即可。

通过文档了解了Integer类之后,下面我们回到资料中总结一下:

Integer:

  • Integer类在对象中包装基本类型int的值

构造方法:

  • Integer(int value):根据 int 值创建 Integer 对象(过时)
  • Integer(String s):根据 String 值创建 Integer 对象(过时)

成员方法:

  • static Integer valueOf(int i):返回表示指定的 int 值的 Integer 实例
  • static Integer valueOf(String s):返回一个保存指定值的 Integer 对象 String

知道了Integer的构造方法后,我们到IDEA中去使用一下:

/*
    构造方法
        Integer(int value):根据 int 值创建 Integer 对象(过时)
        Integer(String s):根据 String 值创建 Integer 对象(过时)

    成员方法
        static Integer valueOf(int i):返回表示指定的 int 值的 Integer 实例
        static Integer valueOf(String s):返回一个保存指定值的 Integer 对象 String
 */
public class IntegerDemo01 {
    public static void main(String[] args) {
//        //Integer(int value):根据 int 值创建 Integer 对象(过时)
//        Integer i1 = new Integer(100);
//        System.out.println(i1);
//
//        //Integer(String s):根据 String 值创建 Integer 对象(过时)
//        Integer i2 = new Integer("100");
//        System.out.println(i2);

//        static Integer valueOf(int i):返回表示指定的 int 值的 Integer 实例
//        static Integer valueOf(String s):返回一个保存指定值的 Integer 对象 String
        Integer i1 = Integer.valueOf(100);
        Integer i2 = Integer.valueOf("100");
        System.out.println(i1);
        System.out.println(i2);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

2.2 Integer(int和String的相互转换)

来,继续啊,下面我们来学习int类型数据和String类型数据的相互转换,关于它们之间的相互转换,我们先到IDEA中去讲解,然后回来总结。

/*
    int和String的相互转换
 */
public class IntegerDemo02 {
    public static void main(String[] args) {
        //int --- String
        int number = 100;
        //方式1
        String s1 = number + "";
        System.out.println(s1);
        //方式2
        //static String valueOf(int i)
        String s2 = String.valueOf(number);
        System.out.println(s2);
        System.out.println("---------------");

        //String --- int
        String s = "100";
        //方式1:String --- Integer --- int
        Integer i = Integer.valueOf(s);
        //int intValue() 返回此值 Integer为 int
        int x = i.intValue();
        System.out.println(x);
        //方式2
        //static int parseInt(String s)
        int y = Integer.parseInt(s);
        System.out.println(y);
    }
}

讲解完毕int类型和String类型的相互转换后,回到资料总结一下:

  • int 转换为 String
    • static String valueOf(int i):返回 int 参数的字符串表示形式。该方法是 String 类中的方法
  • String 转换为 int
    • static int parseInt(String s):将字符串解析为 int 类型。该方法是 Integer 类中的方法

好了,int类型数据和String类型数据的相互转换我们就先讲到这里。

2.3 GUI案例3(猜数字实现)

需求:根据下列要求,完成猜数字的逻辑

1640165180138

要求:

① 系统产生一个1-100之间的随机数

② 猜的内容不能为空

③ 每次根据猜的数字给出相应的提示

知道了猜数字案例的需求和要求后,下面我们到IDEA中去实现一下:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

/*
    1:系统产生一个1-100之间的随机数
    2:猜的内容不能为空
    3:每次根据猜的数字给出相应的提示
*/
public class GuessNumber {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("猜数字");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //系统产生一个1-100之间的随机数
        Random r = new Random();
        int number = r.nextInt(100) + 1;

        //提示信息
        JLabel messageLable = new JLabel("系统产生了一个1-100之间的数据,请猜一猜");
        messageLable.setBounds(70, 50, 350, 20);
        jf.add(messageLable);

        //输入要猜的数字
        JTextField numberField = new JTextField();
        numberField.setBounds(120, 100, 150, 20);
        jf.add(numberField);

        //猜数字的按钮
        JButton guessButton = new JButton("我猜");
        guessButton.setBounds(150, 150, 100, 20);
        jf.add(guessButton);

        guessButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //猜的内容不能为空
                String stringNumber = numberField.getText().trim();
                if(stringNumber.equals("")) {
                    JOptionPane.showMessageDialog(jf,"猜的数字不能为空");
                    return;
                }

                //每次根据猜的数字给出相应的提示
                int guessNumber = Integer.parseInt(stringNumber);

                if(guessNumber > number) {
                    JOptionPane.showMessageDialog(jf,"你猜的数字"+guessNumber+"大了");
                    numberField.setText("");
                } else if(guessNumber < number) {
                    JOptionPane.showMessageDialog(jf,"你猜的数字"+guessNumber+"小了");
                    numberField.setText("");
                } else  {
                    JOptionPane.showMessageDialog(jf,"恭喜你猜中了");
                }
            }
        });

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

2.4 Integer(自动装箱和拆箱)

来,继续啊,下面我们来学习自动装箱和拆箱。

首先,我们来说一下什么是装箱和拆箱:

  • **装箱:**把基本数据类型转换为对应的包装类类型
  • **拆箱:**把包装类类型转换为对应的基本数据类型

了解了装箱和拆箱后,下面我们到IDEA中去演示一下:

/*
    装箱:把基本数据类型转换为对应的包装类类型
    拆箱:把包装类类型转换为对应的基本数据类型
 */
public class IntegerDemo03 {
    public static void main(String[] args) {
        //装箱:把基本数据类型转换为对应的包装类类型
//        Integer i = Integer.valueOf(100);
        Integer ii = 100; //Integer.valueOf(100);

        //拆箱:把包装类类型转换为对应的基本数据类型
        ii += 200;
        /*
            ii = ii + 200;
            ii = ii.intValue() + 200;   //自动拆箱
            ii = 300; //Integer.valueOf(300);
         */
        System.out.println(ii);
    }
}

好了,自动装箱和拆箱我们就先讲到这里。

3:Date和SimpleDateFormat

3.1 Date(构造方法)

来,继续啊,下面我们来学习Date类和SimpleDateFormat类,它们涉及到两个案例:手机日期和时间显示和考勤查询

先来看手机日期和时间显示案例:获取当前时间,按照指定的格式显示在窗体上。

也就是在这里我们要进行把一个Date类型的数据,按照指定的格式,变成一个字符串数据显示出来。

1640165405894

再来看考勤查询案例,我们要通过输入的指定格式的日期字符串数据,得到Date类型的数据。

所以,我们学习Date类和SimpleDateFormat类的重点就是为了把Date类型数据和String类型数据之间进行按照指定格式进行转换。

1640165411817

首先呢,我们先来学习一下Date类,而关于Date类呢,我们先到帮助文档中去查看,然后回来总结,最后到IDEA中去演示。

来,打开我们准备好的帮助文档,关于通过帮助文档查看Date,大家按照老师讲解的API的使用步骤看看即可。

通过文档了解了Date类之后,下面我们回到资料中总结一下:

Date:

  • Date类表示特定的时刻,精度为毫秒

构造方法:

  • Date():分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒
  • Date(long date):分配 Date对象并初始化它以表示自标准基准时间以来的指定毫秒数,即1970年1月1日00:00:00

知道了(的构造方法后,我们到IDEA中去使用一下:

import java.util.Date;

/*
    构造方法:
        Date():分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒
        Date(long date):分配 Date对象并初始化它以表示自标准基准时间以来的指定毫秒数,即1970年1月1日00:00:00
 */
public class DateDemo {
    public static void main(String[] args) {
        //Date():分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒
        Date d1 = new Date();
        System.out.println(d1);

        //Date(long date):分配 Date对象并初始化它以表示自标准基准时间以来的指定毫秒数,即1970年1月1日00:00:00
        Date d2 = new Date(1000 * 60 * 60);
        System.out.println(d2);
    }
}

而目前呢,Date类中没有我们要使用的成员方法,所以,我们也就不看它的成员方法了。

讲解完毕后,大家赶快动手练习一下吧。

3.2 SimpleDateFormat(Date和String的相互转换)

来,继续啊,下面我们来学习SimpleDateFormat这个类。

打开我们准备好的帮助文档,关于通过帮助文档查看SimpleDateFormat,大家按照老师讲解的API的使用步骤看看即可。

通过文档了解了SimpleDateFormat类之后,下面我们回到资料中总结一下:

SimpleDateFormat:

  • SimpleDateFormat 是一个用于以区域设置敏感的方式格式化和解析日期的具体类。我们重点学习日期格式化和解析

  • 日期和时间格式由日期和时间模式字符串指定,在日期和时间模式字符串中,从‘A’到‘Z’以及从‘a’到‘z’引号的字母被解释为表示日期或时间字符串的组成部分的模式字母

常用的模式字母及对应关系如下:

1640165745241

  • **举例:**2021年10月27日 11:11:11
  • **模式:**yyyy年MM月dd日 HH:mm:ss

构造方法:

  • SimpleDateFormat():构造一个SimpleDateFormat,使用默认模式和日期格式
  • SimpleDateFormat(String pattern):构造一个SimpleDateFormat使用给定的模式和默认的日期格式

格式化(从 Date 到 String ):

  • String format(Date date):将日期格式化成日期/时间字符串

解析(从 String 到 Date ):

  • Date parse(String source):从给定字符串的开始解析文本以生成日期

了解了SimpleDateFormat类,以及Date和String相互转换的方法后,我们到IDEA中去体验一下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    构造方法
        SimpleDateFormat():构造一个SimpleDateFormat,使用默认模式和日期格式
        SimpleDateFormat(String pattern):构造一个SimpleDateFormat使用给定的模式和默认的日期格式

    格式化(从 Date 到 String )
        String format(Date date):将日期格式化成日期/时间字符串

    解析(从 String 到 Date )
        Date parse(String source):从给定字符串的开始解析文本以生成日期
 */
public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {
        //格式化(从 Date 到 String )
        Date d = new Date();
        //SimpleDateFormat():构造一个SimpleDateFormat,使用默认模式和日期格式
//        SimpleDateFormat sdf = new SimpleDateFormat();
        //SimpleDateFormat(String pattern):构造一个SimpleDateFormat使用给定的模式和默认的日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s);
        System.out.println("-----------------");

        //解析(从 String 到 Date )
        String ss = "2021-10-27 11:11:11";
//        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date dd = sdf2.parse(ss);
        System.out.println(dd);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

3.3 GUI案例4(手机日期和时间显示实现)

需求:根据下列要求,完成手机日期和时间显示

1640165873028

要求:以当前时间根据格式分别获取日期和时间显示

知道了手机日期和时间显示案例的需求和要求后,下面我们到IDEA中去实现一下:

import javax.swing.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    手机日期和时间显示
 */
public class ShowDateTime {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("手机日期和时间显示");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //提示日期
        JLabel dateLable = new JLabel("日期");
        dateLable.setBounds(50, 50, 100, 20);
        jf.add(dateLable);

        Date d = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String dateString = sdf.format(d);

        //按照格式显示日期的字符串
        JLabel showDateLable = new JLabel(dateString);
        showDateLable.setBounds(50, 80, 200, 20);
        jf.add(showDateLable);

        //提示时间
        JLabel timeLable = new JLabel("时间");
        timeLable.setBounds(50, 150, 100, 20);
        jf.add(timeLable);

        SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
        String timeString = sdf2.format(d);

        //按照格式显示时间的字符串
        JLabel showTimeLable = new JLabel(timeString);
        showTimeLable.setBounds(50, 180, 200, 20);
        jf.add(showTimeLable);

        jf.setVisible(true);
    }
}

讲解完毕后,大家赶快动手练习一下吧。

3.4 GUI案例5(考勤查询实现)

需求:根据下列要求,完成考勤查询的逻辑

1640165952879

要求:根据开始时间和结束时间的字符串解析为日期提示出来

知道了考勤查询案例的需求和要求后,下面我们到IDEA中去实现一下:

这里用到了日历控件类,需要大家把DateChooser.java类准备好

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    考勤查询
 */
public class AttendanceQuery {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("考勤查询");
        jf.setSize(400, 300);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //显示考勤日期的文本
        JLabel dateLable = new JLabel("考勤日期");
        dateLable.setBounds(50, 20, 100, 20);
        jf.add(dateLable);

        //显示开始时间文本
        JLabel startDateLable = new JLabel("开始时间");
        startDateLable.setBounds(50, 70, 100, 20);
        jf.add(startDateLable);

        DateChooser dateChooser1 = DateChooser.getInstance("yyyy/MM/dd");
        DateChooser dateChooser2 = DateChooser.getInstance("yyyy/MM/dd");
        //开始时间输入框
        JTextField startDateField = new JTextField();
        startDateField.setBounds(50, 100, 100, 20);
        dateChooser1.register(startDateField);
        jf.add(startDateField);

        //显示结束时间文本
        JLabel endDateLable = new JLabel("结束时间");
        endDateLable.setBounds(250, 70, 100, 20);
        jf.add(endDateLable);

        //结束时间输入框
        JTextField endDateField = new JTextField();
        endDateField.setBounds(250, 100, 100, 20);
        dateChooser2.register(endDateField);
        jf.add(endDateField);

        //确定按钮
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(250, 180, 60, 20);
        jf.add(confirmButton);

        confirmButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

                //获取开始时间和结束时间的字符串
                String startDateString = startDateField.getText();
                String endDateString = endDateField.getText();

                try {
                    Date startDate = sdf.parse(startDateString);
                    Date endDate = sdf.parse(endDateString);

                    JOptionPane.showMessageDialog(jf,startDate+"\n"+endDate);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
        });

        jf.setVisible(true);
    }
}

这里我们仅仅是演示了考勤查询的日期数据处理,将来呢,我们就可以根据这两个日期数据到考勤查询系统中去查询考勤信息了。

讲解完毕后,大家赶快动手练习一下吧。

1 简答题

1.1 简答题

String类中replace方法的作用是?并举例说明

答:
	replace(旧子串,新子串);
	该方法接收两个参数,使用新子串替换所有的旧子串,并返回新的字符串
	
	System.out.println("你TMD真是个人才".replace("TMD", "***")); //你***真是个人才

String类中trim方法的作用是?并举例说明

答:
	去除该字符串首尾的空格,并返回新的字符串
	
	System.out.println(" 123 ".trim()); //123

String类中length方法的作用是?并举例说明

答:
	返回字符串长度,也就是包含字符的个数
	
	System.out.println("12345".length()); //5

String类中toCharArray方法的作用是?并举例说明

答:
	将该字符串转为对应的字符数组,返回字符数组
	
	char[] chars = "abc".toCharArray(); //遍历数组chars查看结果

1.2 简答题

Integer类中parseInt方法的作用是?

答:
	将字符串类型,解析为int类型
	如果该字符串包含除了数字外的其他字符,则会报NumberFormatException异常
	
	int i1 = Integer.parseInt("100"); //转换成功
    int i2 = Integer.parseInt("123adb"); //NumberFormatException

Date类中getTime方法的作用是?

答:
	获取从时间原点开始,至今经历的毫秒值
	
	Date d = new Date();
    System.out.println(d.getTime()); //1651331634385

    可以转换为天数
    
    System.out.println(d.getTime() / 24 / 60 / 60 /1000); //从时间原点至今经历的天数为19112天

SimpleDateFormat类中format方法的作用是?

答:
	将Date对象,通过指定格式,格式化为String类型
	
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d = new Date(); //当前时间
    String format = sdf.format(d);
    System.out.println(format); //2022-04-30 23:23:23

SimpleDateFormat类中parse方法的作用是?

答:
	将包含日期的字符串,通过指定格式,解析为Date对象
		parse方法有异常,Alt+回车抛出即可
		SimpleDateFormat带参构造的参数为解析格式,如果格式不匹配会报ParseException异常
	
	public static void main(String[] args) throws ParseException {
        String s = "2022-04-30 23:18:25";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(s);
        System.out.println(date); //Sat Apr 30 23:23:23 CST 2022
    }

2 编程题

完成上课的案例
AttendanceQuery 考勤查询 (注意要在同包下准备DateChooser类)
public class AttendanceQuery {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(400, 300);
        jf.setTitle("考勤查询");//设置窗体标题
        jf.setLocationRelativeTo(null);//设置窗体位置在中央弹出
        jf.setDefaultCloseOperation(3);//设置窗体关闭停止程序
        jf.setAlwaysOnTop(true);//设置窗体置顶
        jf.setLayout(null);//取消默认布局

        //创建日期选择器对象,指定日期字符串格式
        DateChooser dateChooser1 = DateChooser.getInstance("yyyy-MM-dd");
        DateChooser dateChooser2 = DateChooser.getInstance("yyyy-MM-dd");

        //考勤日期文本
        JLabel date = new JLabel("考勤日期");
        date.setBounds(50,20,100,20);
        jf.add(date);

        //开始时间文本
        JLabel startTime = new JLabel("开始时间");
        startTime.setBounds(50,70,100,20);
        jf.add(startTime);
        //开始时间文本框
        JTextField startTimeText = new JTextField();
        startTimeText.setBounds(50,100,100,20);
        //把日历控件和文本框进行绑定
        dateChooser1.register(startTimeText);
        jf.add(startTimeText);

        //结束时间文本
        JLabel endTime = new JLabel("结束时间");
        endTime.setBounds(250,70,100,20);
        jf.add(endTime);
        //结束时间文本框
        JTextField endTimeText = new JTextField();
        endTimeText.setBounds(250,100,100,20);
        //把日历控件和文本框进行绑定
        dateChooser2.register(endTimeText);
        jf.add(endTimeText);

        //确定按钮
        JButton btn = new JButton("确定");
        btn.setBounds(250,180,60,20);
        jf.add(btn);

        /*
            根据开始时间和结束时间的字符串
            解析为日期提示出来
            注意自己当时定义的格式: yyyy-MM-dd
         */
        //给确定按钮加入点击事件
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //日期格式化对象
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                //获取文本框的开始时间
                String startTimeStr = startTimeText.getText();
                //获取文本框的结束时间
                String endTimeStr = endTimeText.getText();
                try {
                    //将String分别解析为Date对象
                    Date startDate = sdf.parse(startTimeStr); //这里有异常,alt+回车选择捕获异常即可
                    Date endDate = sdf.parse(endTimeStr);
                    //弹框打印
                    JOptionPane.showMessageDialog(jf,startDate+"\n"+endDate);
                } catch (ParseException parseException) {
                    parseException.printStackTrace();
                }
            }
        });

        jf.setVisible(true);//设置显示窗体(一般写在最后)
    }
}
ChatRoom 聊天室
public class ChatRoom {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(400, 300);
        jf.setTitle("聊天室");//设置窗体标题
        jf.setLocationRelativeTo(null);//设置窗体位置在中央弹出
        jf.setDefaultCloseOperation(3);//设置窗体关闭停止程序
        jf.setAlwaysOnTop(true);//设置窗体置顶
        jf.setLayout(null);//取消默认布局

        //文本域对象
        JTextArea textArea = new JTextArea();
        textArea.setBounds(10,10,360,200);
        jf.add(textArea);
        //文本框
        JTextField text = new JTextField();
        text.setBounds(10,230,180,20);
        jf.add(text);
        //发送按钮
        JButton send = new JButton("发送");
        send.setBounds(200,230,70,20);
        jf.add(send);
        //清空聊天按钮
        JButton clear = new JButton("清空聊天");
        clear.setBounds(280,230,100,20);
        jf.add(clear);
        /*
            1. 将文本框的内容发送到文本域中
            2. 每次发送的文本,不带前后空格
            3. 多次发送的内容在文本域,追加呈现
            4. 清空聊天就是将文本域内容设置为空
         */
        //发送按钮绑定点击事件
        send.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本框的内容,去除收尾空格
                String message = text.getText().trim();
                //发送到本文域,拼接加换行
                textArea.append(message+"\n");
                //清空文本框
                text.setText("");
            }
        });
        //清空聊天按钮绑定点击事件
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //将文本域内容设置为空
                textArea.setText("");
            }
        });

        jf.setVisible(true);//设置显示窗体(一般写在最后)
    }
}
GuessNumber 猜数字小游戏
public class GuessNumber {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(400, 300);
        jf.setTitle("猜数字");//设置窗体标题
        jf.setLocationRelativeTo(null);//设置窗体位置在中央弹出
        jf.setDefaultCloseOperation(3);//设置窗体关闭停止程序
        jf.setAlwaysOnTop(true);//设置窗体置顶
        jf.setLayout(null);//取消默认布局

        //文本对象
        JLabel jLabel = new JLabel("系统产生了一个1-100的随机数,请猜一猜");
        jLabel.setBounds(70, 50, 350, 20);
        jf.add(jLabel);

        //文本框对象
        JTextField jTextField = new JTextField();
        jTextField.setBounds(120, 100, 150, 20);
        jf.add(jTextField);

        //我猜按钮
        JButton btn = new JButton("我猜");
        btn.setBounds(150, 150, 100, 20);
        jf.add(btn);

        /*
            1. 系统产生一个1-100之间的随机数
            2. 猜的内容不能为空
            3. 每次根据猜的数组给出相应的提示
         */
        //产生随机数(正确答案)
        int randomNumber = new Random().nextInt(100) + 1;
        //给按钮添加点击事件
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //猜的(用户输入的)内容不能为空
                String guessNumber = jTextField.getText().trim();
                if (guessNumber.equals("")) {
                    //弹窗给出错误提示
                    JOptionPane.showMessageDialog(jf, "猜的数字不能为空!");
                    return; //不继续执行后面的代码
                }
                //猜的(用户输入的)转为int
                int number = Integer.parseInt(guessNumber);
                //判断
                if(number < 1 || number > 100){
                    JOptionPane.showMessageDialog(jf, "请输入1-100的整数!");
                    jTextField.setText("");//清空文本框
                } else if(number > randomNumber){
                    JOptionPane.showMessageDialog(jf, "猜大了!");
                    jTextField.setText("");//清空文本框
                }else if(number <randomNumber ){
                    JOptionPane.showMessageDialog(jf, "猜小了!");
                    jTextField.setText("");//清空文本框
                }else {
                    JOptionPane.showMessageDialog(jf, "恭喜你,猜对了!");
                }
            }
        });

        jf.setVisible(true);//设置显示窗体(一般写在最后)
    }
}

ShowDateTime 展示当前日期
public class ShowDateTime {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(400, 300);
        jf.setTitle("手机日期和时间显示");//设置窗体标题
        jf.setLocationRelativeTo(null);//设置窗体位置在中央弹出
        jf.setDefaultCloseOperation(3);//设置窗体关闭停止程序
        jf.setAlwaysOnTop(true);//设置窗体置顶
        jf.setLayout(null);//取消默认布局

        //日期文本
        JLabel dateText = new JLabel("日期");
        dateText.setBounds(50,50,100,20);
        jf.add(dateText);

        /*
            获取日期的字符串
         */
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String dataStr = dateFormat.format(new Date());

        //具体日期
        JLabel date = new JLabel(dataStr); //替换日期为动态获取的dataStr
        date.setBounds(50,80,200,20);
        jf.add(date);

        //时间文本
        JLabel timeText = new JLabel("时间");
        timeText.setBounds(50,150,100,20);
        jf.add(timeText);

         /*
            获取日期的字符串
         */
        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
        String timeStr = timeFormat.format(new Date());

        //具体时间
        JLabel time = new JLabel(timeStr);//替换时间为动态获取的timeStr
        time.setBounds(50,180,200,20);
        jf.add(time);

        jf.setVisible(true);//设置显示窗体(一般写在最后)
    }
}
UserLogin 用户登录
public class UserLogin {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setSize(400, 300);
        jf.setTitle("用户登录");//设置窗体标题
        jf.setLocationRelativeTo(null);//设置窗体位置在中央弹出
        jf.setDefaultCloseOperation(3);//设置窗体关闭停止程序
        jf.setAlwaysOnTop(true);//设置窗体置顶
        jf.setLayout(null);//取消默认布局

        //用户名文本框
        JLabel usernameJLabel = new JLabel("用户名");
        usernameJLabel.setBounds(50, 50, 50, 20);
        jf.add(usernameJLabel);
        //密码文本框
        JLabel passwordJLabel = new JLabel("用户名");
        passwordJLabel.setBounds(50, 100, 50, 20);
        jf.add(passwordJLabel);

        //用户名输入框
        JTextField usernameJTextField = new JTextField();
        usernameJTextField.setBounds(150, 50, 180, 20);
        jf.add(usernameJTextField);
        //密码输入框
        JPasswordField passwordJTextField = new JPasswordField();
        passwordJTextField.setBounds(150, 100, 180, 20);
        jf.add(passwordJTextField);

        //登录按钮
        JButton submitJButton = new JButton("登录");
        submitJButton.setBounds(50,200,280, 20);
        jf.add(submitJButton);

        /*
            1. 已知用户名和密码
                heima001
                123456
            2. 用户名和密码的长度都是6-12位
            3.点击登录按钮
                先判断输入的数据长度是否合法
                再判断是否登录成功
         */
        //定义用户名和密码
        String username = "heima001";
        String password = "123456";
        //给按钮添加点击事件
        submitJButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //通过输入框,获取用户输入的数据
                String uname = usernameJTextField.getText();
                String psw = passwordJTextField.getText();
                //判断输入的数据长度是否合法
                if(uname.length() < 6 || uname.length() > 12){
                    //System.out.println("用户名的长度是6-12位请重新输入!");
                    //错误提示在窗体上弹出
                    JOptionPane.showMessageDialog(jf,"用户名的长度是6-12位请重新输入!");
                    //清空文本框
                    usernameJTextField.setText("");
                    return;//错误就停止方法
                }
                if(psw.length() < 6 || psw.length() > 12){
                    //System.out.println("密码的长度是6-12位请重新输入!");
                    JOptionPane.showMessageDialog(jf,"密码的长度是6-12位请重新输入!");
                    //清空文本框
                    passwordJTextField.setText("");
                    return;//错误就停止方法
                }
                //如果合法,再判断是否登录成功
                if(uname.equals(username) && psw.equals(password)){
                    //System.out.println("登陆成功!");
                    JOptionPane.showMessageDialog(jf,"登陆成功!");
                    //清空文本框
                    usernameJTextField.setText("");
                    passwordJTextField.setText("");
                }else {
                    //System.out.println("用户名或密码错误,登陆失败");
                    JOptionPane.showMessageDialog(jf,"用户名或密码错误,登陆失败");
                }
            }
        });

        jf.setVisible(true);//设置显示窗体(一般写在最后)
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/753394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介 TypeScript 是 JavaScript 的超集&#xff0c;是 JavaScript&#xff08;弱类型语言&#xff09; 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

上海六十中学多功能气膜馆项目:轻空间全速推进

项目进展捷报频传 上海六十中学多功能气膜馆项目土建工作已基本完工&#xff0c;今天轻空间团队正式进场&#xff0c;展开气膜部分的施工。我们将为上海六十中学打造一个现代化、环保、高效的多功能气膜馆&#xff0c;提供优质的运动和活动场所。 现场施工一片繁忙 在施工现场&…

Windows部署MinIO,搭建本地对象存储服务

一、前言 二、MinIO介绍 三、Windows部署MinIO服务 1、准备工作 2、下载MinIO服务 3、启动MinIO服务 4、设置用户名密码 5、创建.bat文件启动服务 四、MinIO基本操作 1、存储桶管理 2、对象管理 3、数据查看 一、前言 基于外网的项目&#xff0c;可以使用阿里云等…

python数据分析与可视化二

公共部分 # 引入数据分析工具 Pandas import pandas as pd # 引入数据可视化工具 Matplotlib import matplotlib.pyplot as plt # 引入科学计算库numpy import numpy as np from scipy import stats #解决输出时列名对齐问题 pd.set_option(display.unicode.east_asian_wid…

【Redis-04 补充】Redis事务

【Redis-04 补充】Redis事务 1. 事务冲突的问题1.1 举例1.2 悲观锁1.3 乐观锁1.4 Redis中的乐观锁 WATCH key [key …]1.5 Redis事务三特性 2. 秒杀案例2.1 相关代码2.2 模拟并发工具httpd-tools 3. 设计一个秒杀系统3.1 预热库存3.2 秒杀请求3.3 生成订单3.4 限流与防刷 4. 总…

如何找合适的C++项目给自己的简历加分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; C的工作多种多样&#x…

[深度学习] 前馈神经网络

前馈神经网络&#xff08;Feedforward Neural Network, FFNN&#xff09;是人工神经网络中最基本的类型&#xff0c;也是许多复杂神经网络的基础。它包括一个输入层、一个或多个隐藏层和一个输出层。以下是详细介绍&#xff1a; 1. 结构 1. 输入层&#xff08;Input Layer&am…

入门网络安全工程师要学习哪些内容

大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称&#xff0c;学习的东西很多&…

Flexsim物流仿真入门-利用网络节点控制行走路线

在布局优化过程中&#xff0c;往往叉车&#xff0c;操作人员的搬运&#xff0c;是会按照一定的行走路线进行的&#xff0c;这就需要我们进行节点的设计&#xff0c;以此来实现特定路径的行走。 在构建过程中&#xff0c;这里将会以案例的形式进行讲解说明。 1&#xff09;构建…

【Linux】进程间通信_3

文章目录 七、进程间通信1. 进程间通信分类命名管道 未完待续 七、进程间通信 1. 进程间通信分类 命名管道 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文件…

操作系统之《死锁与银行家算法》【知识点+详细解题过程】

知识点&#xff1a; 1、什么是死锁&#xff1f;&#xff08;别名"三角恋"&#xff0c;我喜欢你你喜欢他他喜欢我&#xff0c;明明都单身但是就是‘占有’不了&#xff09; 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法…

vue-cli的搭建过程

一、创建一个vue2的项目 二、创建成功后删除这三个文件 三、新建一个App.vue文件 四、在文件中添加这一段话 五、打开命令框输入指令下载router路由 六、新建一个router目录&#xff0c;新建index.js文件 七、导入你的路由&#xff0c;进行配置 打开命令行工具&#xff0c;进入…

【Python Tips】创建自己的函数包并安装进Anaconda,像引入标准包一样直接import导入

目录 一、引言 二、方法步骤 步骤一&#xff1a;创建包目录结构 步骤二&#xff1a;配置__init__.py文件 步骤三&#xff1a;文件夹外配置setup.py文件 步骤四&#xff1a;终端Pip安装 三、结尾 一、引言 在编写项目代码的时候&#xff0c;有些自定义功能的函数是可以复用的。…

Java面向对象特性

Java继承&#xff1a; 继承的概念&#xff1a; 在Java中&#xff0c;继承&#xff08;inheritance&#xff09;是面向对象编程的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c…

MySQL高级-SQL优化- order by 优化(尽量使用覆盖索引、注意联合索引创建的规则、增大排序缓冲区大小)

文章目录 0、order by优化原则1、Using filesort2、Using index3、连接数据库4、查看索引5、删除索引6、按照年龄进行排序7、执行计划 order by age8、执行计划 order by age,phone9、创建联合索引 (age,phone)10、再次执行计划 order by age11、再次执行计划 order by age,pho…

SpringMVC处理器映射器HandlerMapping详解

目录 一、前言 二、initHandlerMappings 三、处理器映射器架构 策略接口 请求链 模版类 四、RequestMappingHandlerMapping的初始化 HandlerMethod映射器模版类的初始化 AbstractHandlerMethodMapping.MappingRegistry&#xff1a;内部类注册中心 五、Reques…

从菌群代谢到健康影响——认识肠道丙酸和丁酸

谷禾健康 短链脂肪酸这一词经常出现在谷禾的文章和报告中&#xff0c;那你真的了解短链脂肪酸吗&#xff1f;短链脂肪酸(SCFA)主要是肠道微生物群在结肠内通过发酵碳水化合物(包括膳食和内源性碳水化合物&#xff0c;主要是抗性淀粉和膳食纤维)和一些微生物可利用的蛋白质而产生…

一个人 三个月 干了二十万

相信很多人是被这个标题吸引进来的&#xff0c;但我并不是标题党&#xff0c;我也很讨厌标题党&#xff0c;这篇文章也不在乎流量&#xff0c;更多的是想记录下。 出来创业三个多月了&#xff0c;给大家汇报一下这段时间的业绩吧。一个人&#xff0c;三个多月&#xff0c;干了…

线性图标绘制指南:从基础到精通

图标在生活中随处可见。相比文字来说&#xff0c;图标可以让人在更短的时间内认知并了解信息&#xff0c;并且大大提升信息的视觉美观性&#xff0c;增加设计的艺术感染力。在用户界面中使用图标&#xff0c;是一种用户熟知的设计模式。而线性图标是通过提炼图形轮廓&#xff0…