2022.12.22
时间:1995
创始人:詹姆斯·高斯林
公司:Sun
08年甲骨文公司(oracle)收购了Sun
1、简单性
2、高安全性
3、可跨平台:只写一套Java代码,各个平台都可以用
4、可移植性
5、健壮性:不容易出bug
Java se java语法
Java ee java web端应用 网页
Java me 手机相关的开发,但是因为市场主要是Android和IOS,所以me逐渐被合并到ee里面
JDK是开发工具包
JRE属于运行环境
JVM运行Java的虚拟机,才能提供Java运行
源文件--》编译器--》字节码文件(xx.class)--》解释器--》输出
编译语言:写完的源代码不能直接执行,需要进行编译成字节码文件才可以运行
脚本语言:写完了之后就能立刻运行的语言
Java是编译的高级语言,是一门需要编译后才可以运行的语言,用编辑器进行Java代码的书写,使用idea进行开发
JDK 就是Java开发需要的工具,所有工具都在里面
JDK通常使用稳定版本
第一个Java语言,必须使用英文符号
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
工作空间 --》项目 --》包 --》Java文件
所有Java的程序必须写在这对大括号里面才能执行
public static void main(String[] args) {
}
右键类名 --》打开于 --》Explorer
2022.12.23
1、基本元素:
1)标识符:类名、变量名、常量名、方法名
2)关键字:属于Java官方已经用掉的单词
3)常量:声明后不再变化的量
4)注释:1.标注代码含义,2.让代码不再运行
方式一: //声明一个变量(一般用于单行)
方式二: /*声明一个变量(一般用于多行)*/
方式三: /** * 文档注释 */
2、数据类型:
不同类型的数据能做的事情不一定相同,基于这个情况,人们总结了多种数据类型。
数据类型分为两大类
1)基本数据类型:Java官方直接提供的确定的数据类型,共8种
boolean、char、byte、short、int、long、float、double
2)复合数据类型
3、运算符
4、表达式
一个标识符可以是大写或者小写字母、数字、下划线、美元符号的任意顺序组合,注意不能有空格、@、#、等特殊符号。否则容易与数字、常量相混淆。Java区分字母大小写。
声明一个变量,结构为:数据类型 变量名 = 变量值。
变量命名规范:语义化,即见名知意
例:学生信息表:stuInfoTable --- 驼峰式命名法
String str = "Hello World";
声明完成变量之后,直接写方法名既能掉用。使用过的变量名不能重复使用,需要重新命名。
规则:必须遵守的,不遵守就会报错
规范:合法但有毛病的语句
一、特殊类型2种:
布尔类型boolean:只有两个值true 和false
boolean b1 = true;
boolean b2 = false;
字符类型char :只能有一个内容,不能有多个,多个就会报错,但是纯数字不加单引号则可以
char c1 = 'A';
char c2 = '1';
char c3 = '你';
char c4 = '?';
char c5 = 100;
二、整数类型4种:都是存储整数,但是所占位数不一样
字节型byte:
byte by1 = 127;
短整型short:
short s1 = 32767;
整型int:
int num = 2147483647;
长整型long:比较特殊,如果末尾不加L,默认为int类型。一般建议写大写的L,方便辨识。
long l1 = 2147483648L;
三、浮点(小数)类型的2种:Java程序中直接写出的小数数据叫做直接量,默认为double类型
浮点型float:,float后缀要加f或F
float f1 = 12.5f;
float f2 = 12.5F
双精度浮点型double:
double d1 = 12.5;
1、数据类型的自动转换,位数少的可以自动转换成位数长的。
//自动数据类型转换
byte by2 = 100;
short sh1 = 1000;
//让两个数字相加,并且给的给过是一个变量名
int an = by2 + sh1;
2、数据类型的强制转换:只有强制转换才能将位数长的变成位数短的
语法:目标类型 变量名 = (目标类型)原类型变量名
//强制类型转换 在等号的右边加上(),括号内填写需要转换的类型
int numm = 128;
byte by3 = (byte) numm;
1)强制转换过程中,数据可能导致溢出或损失精度。
2)浮点数到整数的转换是通过舍弃小数得到,不是四舍五入
(int)23.7 结果为 23 (int)-45.89f 结果为 -45
2022.12.28
算数运算符:+(加),-(减),*(乘),/(除),%(取余),++(自增1),--(自减1)
//算数运算符
int num = 10;
int num2 = num++; //先赋值,在自增
int num3 = ++num; //先自增,在赋值,此时的num在int2中已自增,值为11
System.out.println(num2);
//输出结果为10
System.out.println(num3);
//输出结果为12
比较运算符:>(大于),<(小于),>=(大于等于),<=(小于等于),==(判断等于),!=(不等于)
//比较运算符
System.out.println(5 > 4); //true
System.out.println(3 < 5); //true
System.out.println(6 >= 5); //true
System.out.println(4 <= 4); //true
System.out.println(10 == 10); //true
System.out.println(7 != 10); //true
逻辑运算符:&(且),|(或),!(非)
//逻辑运算符
System.out.println((10 > 7) & (4 < 6)); //且:要求是多个条件都满足才为true
System.out.println((10 > 7) | (8 < 6)); //或:要求多个条件中只要有一个满足就为true
System.out.println(!(4 < 6)); //求反
位运算符:仅做了解(相对用的少),核心是将数字变为二进制之后按照二进制的每一位进行对比
例子:&意思是两个二进制位都是1结果就是1,反之为0
//位运算符
System.out.println(7 & 9); //1
赋值运算符:=(等),+=(加等),-=(减等),*=(乘等),/=(除等)
//赋值运算符
int a = 100;
System.out.println(a);
a += 10; //100+10=110
System.out.println(a);
a *= 2; //110*2=220
System.out.println(a);
a /= 10; //220/10=22
System.out.println(a);
条件运算符: (......) ?(.......) :(......)(也称三目运算符)
//三目运算符
int san = 4 > 6 ? 100 : 200; //条件成立则等于冒号前的值,不成立则为冒号后的值
System.out.println(san); //200
首字母一般大写
字符串:String 使用双引号 并且 可以有多个,字符串碰到"+"号会变成拼接
"+":如果遇到了字符串,则"+"就是拼接,如果没有遇到字符串,那么就是求和
//字符串
String str = "hello world";
System.out.println(str); //hello world
System.out.println(str + 10 + 20); //hello world1020
System.out.println(10 + 20 + str); //30hello world
表达式:运算符和操作数的序列
Scanner 用于输入的工具
所有Java代码的基础运行流程是从上往下,同一行中从左往右,并且只运行一次
有时候就需要流程控制语句来修改这个流程
1、分支语句
(1)if(条件){
//当条件成立时执行的代码;
}
//if语句
if(5 > 4){
System.out.println("12345");
}
(2)if(条件:布尔值或结果为布尔值的表达式){
//当条件成立时执行的代码;
} else{
//当条件不成立时执行的代码;
}
//if()...else 语句
int num1 = 5;
if (num1 > 8){
System.out.println("num1 > 8");
} else {
System.out.println("num1 < 8");
}
(3)if(条件1){
//当条件1成立时执行的代码
} else if(条件2){
//当条件2成立时执行的代码
} else if(条件3){
//当条件3成立时执行的语句
}
//if()...else if()...语句
System.out.println("请输入一个正整数");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if (num > 0 & num % 3 == 0 & num % 4 == 0) {
System.out.println("这个数既是3的倍数又是4的倍数");
} else if(num > 0 & num % 3 == 0){
System.out.println("这个数是3的倍数");
} else if (num > 0 & num % 4 == 0){
System.out.println("这个数是4的倍数");
} else {
System.out.println("这个数既不是3的倍数,也不是4的倍数");
}
2022.12.29
分支语句
(4) switch...case...语句:本质就是把小括号里面的变量拿出来比较
switch(需要对比的变量){
case 值1:
//当变量等于该值的时候执行的代码
break;
case 值2:
//当变量等于该值的时候执行的代码
break;
......
default: //类似于最后的else
break;
}
System.out.println("请输入一个数字");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
switch (num){
case 1:
System.out.println("今天吃麦当劳");
break;
case 2:
System.out.println("今天吃华莱士");
break;
case 3:
System.out.println("今天吃必胜客");
break;
case 4:
System.out.println("今天吃肯德基");
break;
case 5:
System.out.println("今天吃汉堡王");
break;
case 6:
System.out.println("今天吃德克士");
break;
case 7:
System.out.println("今天吃海底捞");
break;
default:
System.out.println("输入有误,请重新输入");
break;
}
问题1:break可以去掉吗?
可以去掉,去掉之后语句会贯穿,执行到下一个break
问题2:default写在前面会怎样?
default写在哪里都不会有影响
有时代码会重复多次造成冗余,就是冗长的,多余的
目的1:写的内容比别人少
目的2:方便调试或修改代码
1、for循环语句
for (初始化变量;范围判断;增量){ 小括号里面也是写条件,不过for的条件有3个,条件间用分号;隔开
// 循环体,就是循环运行过程中执行的代码
}
//打印10次Hello World
for (int i = 0; i < 10; i++) {
System.out.println("Hello World!");
}
2022.12.30
1、for
for(条件){
//语句
}
//for循环
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
2、while (当...的时候)
while(布尔表达式){
语句集;
}
//while循环
int j = 1;
while (j<=10){
System.out.println(j);
j++;
}
3、do...while
do
{
语句
}while(条件:布尔表达式);
//do...while
int k = 1;
do {
System.out.println(k);
k++;
} while (k <= 10);
do...while 属于后置判断循环,for和while属于前置判断循环
do...while 至少执行一次
while属于不确定次数的循环,for属于确定次数的循环
break:终止循环
continue:结束本次循环并进行下一次循环
随机数Random也和Scanner一样,是Java定义的
Random random = new Random();
int computer = random.nextInt(3); //随机生成0、1、2中的一个随机数
获取随机数字 直接获取 所有int中的 随机数
在nextInt的括号里面 可以指定随机范围 必须是大于0的正整数
2022.12.31
System.out.println(); //输出并换行
System.out.print(); //输出但不换行
数组是数据的集合,并且在Java中可以实现一个变量名承载多个数值,数组的使用分为声明和调用,数组的长度是固定的,数组的英文叫array
数组的声明:
1、静态声明
//静态数组的声明
String str[] = {"张三","李四","王五"};
2、动态声明
//动态数组声明
int numAry[] = new int[5];
//中括号内写数组长度
//如果不提供内容,那么int型默认为0。String 默认为null(指什么也没有,什么都不是)
for (int i = 0; i < numAry.length; i++) {
System.out.println(numAry[i]);
}
数组的调用:
数组获取里面的内容靠编号,专业称呼被称为下标,数组的下标从0开始,最大到数组长度-1。数组长度可以写成:数组名.length
for (int i = 0; i < strAry.length; i++) {
System.out.println(strAry[i]);
}
数组中可以存放数组吗?
可以。数组中存放数组称为多维数组
2023.1.1
String stu1[] = {"001","张三","男","JX2212"};
String stu2[] = {"002","李四","女","JX2212"};
String stu3[] = {"003","王五","男","JX2212"};
//几维数组就有几个中括号
String allStu[][] = {stu1,stu2,stu3};//二维数组
System.out.println(allStu); //如果直接查看二维数组,会发现最前面有两个中括号
System.out.println(allStu[0]);//二维数组指代一个下标出来的是一维数组
System.out.println(allStu[0][1]); //二维数组需要两个下标才能取到内容。第一个下标:行数(Y轴),第二个下标:列数(X轴)
实现步骤:
1、初始化地图
//1、初始化地图
String map[][] = new String[5][5];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
map[i][j] = "o";
}
}
2、放置老鼠
//2、放置老鼠
Random ran = new Random();
int mouseX = ran.nextInt(5);
int mouseY = ran.nextInt(5);
map[mouseY][mouseX] = "X";
3、绘制地图
//3、绘制地图
System.out.println("⭐⭐⭐游戏地图⭐⭐⭐");
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
System.out.println("老鼠的横坐标:" + mouseX + ",纵坐标:" + mouseY);
4、开始输入坐标,打地鼠
//4、输入打击的坐标
Scanner sc = new Scanner(System.in);
System.out.println("请输入打击的横坐标");
int userX = sc.nextInt();
System.out.println("请输入打击的纵坐标");
int userY = sc.nextInt();
5、判断是否命中
//5、判断是否命中
if (map[userY][userX] == "X") {
System.out.println("恭喜你,打中了");
} else {
System.out.println("很遗憾,没打中");
}
6、判断是否继续
//判断是否继续
System.out.println("是否继续游戏?输入Y继续,N退出");
String again = sc.next();
if (again.equals("Y")) {
System.out.println("继续游戏");
} else if (again.equals("N")){
System.out.println("结束游戏");
break;
}
==本质上比较的是内存地址,内存地址相同,结果为true,反之,地址不同,结果就为false
内容比较用equals
具备特定功能的,高度封装的,代码块
2023.1.3
使用函数是为了减少代码的冗余
具备特定功能的高度封装的代码块
封装:省略技术细节,只提供使用方法
1、内置函数:Java内部自带的函数,例如:System.out.println( )
2、自定义函数:用户自己写好的函数
1、函数的声明:方法5要素
函数中不能嵌套函数
1)修饰符:public static
public意为共有的,公共的。static意为静态的
2)返回值类型:void 意为没有返回值
3)方法名/函数名:标识符命名规则
4)参数列表:中括号里的
5)方法体:大括号即可{}
//在主方法之外,进行函数的声明
public static void myFn(){ //Fn的意思是函数
System.out.println("函数执行了");
}
2、函数的调用
函数名+()
public static void main(String[] args) {
myFn();
}
把需要重复执行的代码放入函数中即可
参数就是将冗余代码中不同的地方提取出来
参数分为
1:形参 形式参数 只是占位子,没有实际含义的参数,用在函数的声明过程
public static void myFn(int x){ //这里的x就是形参
int sum = 0;
for (int i = 0; i <= x; i++) {
sum += i;
}
System.out.println("1-" + x + "的和等于:" + sum);
}
2:实参 实际参数 具备实际意义的,有内容的参数,用在函数的调用过程中
public static void main(String[] args) {
myFn(50); //括号里的就是实参
myFn(100);
myFn(200);
}
参数可以写多个,多个参数之间使用逗号‘,’分割
形参的顺序需要和实参的一致
变量作用域 即 函数内的变量,他不能被拿到函数外面使用
如果需要将局部变量拿到外面就需要返回值return
public static int myFn(int min , int max){ //因为sum是int型,所以返回值用int。
int sum = 0;
for (int i = min ; i <= max; i++) {
sum += i;
}
System.out.println(min + "-" + max + "的和等于:" + sum);
return sum; //将sum return出去
}
public static void main(String[] args) {
int abc = myFn(0,50); //使用abc去接收函数return出来的sum
System.out.println("外部使用sum等于:" + abc);
}
1、将函数内的变量拿出
2、终止函数
2023.1.4
什么是对象?
世间万物皆对象 世界上所有看得见摸得着的都是对象
特征---在面向对象中叫:属性
能做的事---在面向对象中叫:方法
将多个对象共同的属性和方法抽取出来,形成类
类相当于模板 相当于设计图 是不能直接做事情的
Java就是面向对象的编程语言
Java的基本单元就是类,即class,同时class也是数据类型
Java中要使用对象,需要先写好类,从类里面实例化对象
类是Java的核心和本质。它是Java语言的基础,因为类定义了对象的本质。 类定义了一种新的数据类型,可以用新类型来创建该类型的对象 类(class)是对象(object)的模板,而对象(object)是类的一个实例(instance).
比较下来,面向对象可以优化冗余代码,以及模拟现实生活
面向对象还有好处,面向对象具备三大特性:封装、继承、多态
public class Dog {
/**
* 1、小狗
* 属性:颜色、品种、年龄、姓名、性别
* 方法:跑、跳、吃饭
*/
public String colour = "黄色";
public String variety = "中华田园犬";
public int age = 2;
public String name = "小汪";
public String sex = "公";
public void run(){
System.out.println(name + "在跑");
}
public void jump(){
System.out.println(variety + name + "在跳");
}
public void eat(){
System.out.println(colour + variety + name + "在喝酸奶");
}
}
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.colour);
System.out.println(dog.variety);
System.out.println(dog.age);
System.out.println(dog.name);
System.out.println(dog.sex);
dog.run();
dog.jump();
dog.eat();
}
}
运行结果:
2023.1.5
1、封装
2、继承
3、多态
面向对象的封装
属性应该是不能被随意修改的,所以我们要使用封装,封装好属性
public class Cat {
public String catName = "咪咪";
private int catAge = 2;
public String catColor = "橘色";
public void showMyself(){
System.out.println("喵~,我叫:" + catName + " ,我今年" + catAge + "岁,颜色是:" + catColor);
}
//修改私有的方法是使用set
public void setCatAge(int catAge) { //修改的方法
if (catAge >= 0 && catAge <= 10){
this.catAge = catAge; //this的意思类似于中文的我自己,指对象本身
}
}
//获取私有的方法是使用get
public int getCatAge() { //获取的方法
return catAge;
}
}
public class TestCat {
public static void main(String[] args) {
Cat cat = new Cat();
cat.catName = "花花"; //修改完属性之后,该对象的属性就发生了改变
cat.setCatAge(8);
System.out.println(cat.getCatAge());
cat.showMyself();
}
}
用于修饰某个属性或方法的可用性
public 公共的,即所有类都可以随意使用
private 私有的,即能且只能在本类中使用。私有化不是为了完全不用,而是有条件的使用,所以要重写方法
私有化属性,并提供共有的访问方法
2023.1.28
StringBuffer:是一个线程安全的可变字符序列
StringBuilder:
但是万一需要给基本数据类型用上方法咋办呢?
使用封装类
boolean--->Boolean
char--->Character
byte--->Byte
short--->Short
int--->Integer
long--->Long
float--->Float
double--->Double
原本正常的情况,但是遇到意外导致了程序中断
try...catch finally throw throws 这几个关键字来解决
1、try...catch 使用 try catch 最关键的地方是 是让程序遇到了异常 能继续运行
//try...catch
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字");
try { //大括号里面写可能出问题的代码
double scNum = sc.nextInt();
double num = 10/scNum;
System.out.println(num);
} catch (InputMismatchException e){
//e就是异常对象,
//中括号里面写异常类型,
//大括号里面写对应异常发生之后需要执行的代码
System.out.println("出错了,请输入数字");
} catch (ArithmeticException e){ //catch可以嵌套使用
System.out.println("请不要输入‘0’");
} catch (Exception e){
//Exception属于所有异常的总父类,
//InputMismatchException-->输入异常,具体的异常类
System.out.println("出现未知异常,请联系管理员");
}
System.out.println("程序运行结束");
异常和错误的区别:异常在正常情况下可以运行,但是 错误属于100%错误
相当于 让程序运行到指定的位置的时候 暂停下来
2023.1.29
为了开始做账号的登录注册功能,
准备先使用数据库来进行功能的实现
数据库管理系统
关系型数据库:一个软件中含有若干个库,一个库中含有若干个表,一个表中含有若干条信息,一条信息种含有若干个字段
比较有名的关系型数据库:Mysql Oracle sqlite ...
mysql可以使用命令行
mysql基本语法:增删改查
使用软件工具(可视化工具)来进行操作
连接步骤:
1)IP:网络地址 localhost 或 127.0.0.1代表本地(本台电脑)
2)端口:每个软件都有一个自己专有的端口 3306是MySQL的默认端口
3)账号密码 正常输入
4)确认信息后即可连接,完成连接后就可以脸上数据库
增
完整添加:即表里面有几个字段values里面必须写几个
insert into 表名 values(信息一,信息二,信息三...);
insert into student values(6,'600','白骨精','女',100,'西游班');
指定添加
insert into 表名(字段名一,字段名二,字段名三...) values(信息一,信息二,信息三...);
insert into student (stuName,stuSex,stuAge) values ('孙二娘','女',33,);
删
整体删除
delete from 表名-----》该语句是删除表内所有信息(慎用)
指定删除
delete from 表名 where 条件
delete from student where stuAge = 33;
改
整体修改
update 表名 set 字段名 = 值-----》整个表全改
指定修改
update 表名 set 字段名=值 where 条件 符合条件的 即可修改
update student set stuAge = 10000 where stuAge = 100
查
select 字段 from 表----->查询对应表中的某些字段信息 select * from 表名 查询表中的所有信息
select stuName,stuAge from student;
select 字段 from 表 where 条件 根据条件查询内容
where条件
查询年龄24-26之间的所有信息
select * from stutable where stuAge between 24 and 26
查询姓李的同学-----》模糊查询
select * from student where stuName like '李%';
desc 从大到小 asc从小到大
按照年龄从小到大排序
select * from student order by stuAge
按照年龄从大到小排序
select * from student order by stuAge desc;
2023.1.30
聚合函数
求和sum(),最大max(),最小min(),平均值avg()
-- 1:查询李四最好的成绩是几分 select max(score) from sc,student where sc.sno = student.sno and student.sname = '李四'
-- 2:查询张三最差的成绩是多少 select min(score) from sc,student where sc.sno = student.sno and student.sname = '张三'
-- 3:查询年龄最大的同学是几岁 select max(sage) from student
-- 4:查询男生的平均年龄是多少 select avg(sage) from student where ssex = '男'
-- 5:查询002课程的平均分 select avg(score) from sc where cno = 'c002'
分组
group by
-- 6:查询每一位有成绩记录的同学的平均分是多少
select sno,avg(score) from sc group by sno
多表查询
子查询 同时写 多个select 环过 除了第一个select之外 其他的 select 放在 括号里面 查询多个信息要用in
Java语言编写的 用于 访问数库的规范 JDBC提供Java访问数据库的 规范/接口具体的访问实现 就交给 名个数据库厂商 进行实现
由鼠标连接电脑做示范模拟JDBC连接数据库
1、鼠标插入电脑-----》先将驱动程序下载到程序中(将jar包导入项目中)
2、电脑安装鼠标驱动-----》程序先安装驱动
3、测试是否能够建立连接-----》Connection conn = DriverManager.getConnection(ur1,"root","root");
4、思考要用鼠标干嘛-----》写SQL语句
5、准备开始动手做事情-----》创建一个执行者对象
6、做事情并获取结果-----》执行者对象执行SQL语句并获取结果
7、做完事情关掉电脑拔掉鼠标-----》关闭连接,释放资源
//需要抛出异常或者用try catch解决异常
//因为Java代码不清楚到底有没有引入驱动包
Driver myDriver = new Driver();
//加上?userSSL=false 就是不让连接使用SSL
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/jx2212",
"root",
"root"); //获得连接
System.out.println(conn);
String sql = "delete from student where stuName = '吕布'"; //SQL语句 - 删
Statement stsm = conn.createStatement(); //创建执行者对象
int ans = stsm.executeUpdate(sql); //执行SQL语句
System.out.println("执行SQL语句的结果是" + ans);
String sql = "insert into student values(2,'200','吕布','男',40,'三国班')"; //SQL语句 - 增
Statement stsm = conn.createStatement(); //创建执行者对象
int ans = stsm.executeUpdate(sql); //执行SQL语句
System.out.println("执行SQL语句的结果是" + ans);
String sql = "update student set stuAge = 12345 where stuAge = 10000"; //SQL语句 - 改
Statement stsm = conn.createStatement(); //创建执行者对象
int ans = stsm.executeUpdate(sql); //执行SQL语句
System.out.println("执行SQL语句的结果是" + ans);
String sql = "select * from student"; //SQL语句 - 查
Statement stsm = conn.createStatement(); //创建执行者对象
ResultSet rs = stsm.executeQuery(sql); //执行SQL语句
while (rs.next()) { //判断有没有下一个内容
System.out.println(rs.getString("stuName"));
}
//释放资源 规则:先开启的后关,后开启的先关
rs.close();
stsm.close();
conn.close();
2023.1.31
浏览器 软件
Browser-server Client-server
使用Swing 技术来搭建
Swing就是一个Java内置的插件库
Swing的绝大多数代码(除了一个之外)都以J开头
分成三层结构:顶级容器--》中间容器--》组件
JFrame:顶级容器
public MyFirstJFrame(){
setSize(600,400); //设置大小
setLocationRelativeTo(null); //设置居中
setTitle("我的第一个界面"); //界面的标题
setDefaultCloseOperation(EXIT_ON_CLOSE); //点X的时候,退出程序
setResizable(false); //不允许调整大小
//为了让中间容器加入顶级容器,就在顶级容器里面add中间容器
MyFirstJPanel mypanel = new MyFirstJPanel();
add(mypanel);
setVisible(true); //设置可见,一般放在最后面
}
JPanel:中间容器
public MyFirstJPanel() {
setBackground(new Color(239, 115, 23)); //设置背景颜色,改变数值变颜色
setLayout(null); //设置自由布局
//直接放置组件
}
JButton:按钮
//第一个组件---按钮
JButton btn1 = new JButton("按钮");
btn1.setSize(60,35); //设置大小
btn1.setLocation(100,100); //设置位置
add(btn1);
JLable:文字或图标
//第二个组件---文字或图标
JLabel lb1 = new JLabel("今天天气很好");
lb1.setBounds(200,200,150,35); //设置大小和位置,等同于setSize + setLocation
add(lb1);
JFextField:输入文本框
//第三个组件---文本输入框
JTextField field1 = new JFormattedTextField();
field1.setBounds(300,300,100,35);
add(field1);
2023.2.1
1)用于显示菜单的菜单栏
2)可以点击的菜单
3)点击后弹出来的 菜单项
4)二级菜单
菜单写在顶级容器(JFream)里面
只有JMenuBar的添加用的是setJMenuBar
myBar = new JMenuBar(); //这是菜单栏
menu1 = new JMenu("菜单1"); //这是菜单1
item1 = new JMenuItem("选项1"); //菜单项
menu1.add(item1); //菜单项加入菜单中
myBar.add(menu1); //餐单加入菜单栏中
menu4 = new JMenu("二级菜单"); //二级菜单
item2 = new JMenuItem("二级菜单项"); //二级菜单项
menu4.add(item2); //二级菜单项加入二级菜单
menu1.add(menu4); //二级菜单加入一级菜单
setJMenuBar(myBar); //绘制菜单栏
Layout
在不设置布局的情况下,如果修改界面大小,相同的元素,可能排列方式不同,因为宽度变化了
自由布局
FlowLayout 流式布局 JPanel的默认布局
BorderLayout 边界布局 JFream的默认布局
GridLyout 网格布局
CardLayout 卡片布局
1、流式布局:组件并排排放放不下了就去下一行
setLayout(new FlowLayout(FlowLayout.RIGHT,10,20)); //流式布局的右对齐,先左右间隙,后上下
2、边界布局:根据上下左右中放置组件,如果在边界布局中直接 add, 默认会加在中间,所以add需要指定方位
边界布局里面的5个区域能且仅能放置一个组件
如果使用自由布局的ipanel 会导致 在边界布局中 不占据大小
所以此时 需要 自由布局的jpanel 主动提出 自己需要的大小,setPreferredSize(设置首选大小)
setLayout(new BorderLayout()); //边界布局
bt5 = new JButton("按钮5");
add(bt5);
RightJPanel rightJPanel = new RightJPanel();
add(rightJPanel,BorderLayout.EAST);
以左右样式为例,边界布局的右侧界面
setLayout(null);
setPreferredSize(new Dimension(200,0)); //因为处于右侧,高度固定占满,不用设置
JButton btn1 = new JButton("右侧按钮1");
btn1.setBounds(10,50,150,20);
add(btn1);
3、网格布局
按照格子的方式 排列组件
营数可以选择无参数 2个数 4个参数
参数的时候 参数分别代表 行数和列数优先满足行数
setLayout(new GridLayout(4,2));
//网格布局,参数分别代表行数和列数,优先满足行数,第一个数值指行,第二个数值指列
bt1 = new JButton("按钮1");
add(bt1);
bt2 = new JButton("按钮2");
add(bt2);
bt3 = new JButton("按钮3");
add(bt3);
文件路径 不是用Java文件存图,而实引入图片,只需要写好图片引入的路径即可
在项目的src文件夹同级的位置放置素材
然后再JPanel里面进行图片的绘制
需要一个方法
//绘制图片
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Image bgImg = new ImageIcon("images/5.jpg").getImage();
g.drawImage(bgImg,0,0,600,500,null);
}
2023.2.2
通俗理解成一个可以在代码中存储并显示其他语言的字典
字符集乱码:不同的字符集中,相同的代码所代表的内容 不同 所以看上去是乱码 解决方案: 使用记事本来解决 记事本中另存为然后修改编码 即可恢复 gbk 就是 ansi
用来让各个组件点击有反应
Java使用的事件是授权事件模型
事件的重点是
1)事件源:事件的源头,通常是组件
2)监听器:不断的监视事件源,直到事件源发生了什么,一般放在controller里面,可以运用接口 来实现 也可以 使用 抽象类的继承
//监听器-----鼠标监听
public class LogLis extends MouseAdapter {
public Controller con;
public LogLis(Controller con) {
this.con = con;
}
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
try {
con.login();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
//监听
LogToWelLis toWelLis = new LogToWelLis(); //先实例化监听器
cancel.addMouseListener(toWelLis); //用组件(按钮).addMouseListener(监听器)
即获取账号、密码、确认密码
String acc = UI.logFrame.logPanel.accInt.getText(); //Jpanel.组件.getText();
JOptionPane.showMessageDialog(null, "登录成功", "提示信息",JOptionPane.INFORMATION_MESSAGE);