JAVA -- 06
AI Prompt:我是一名Java开发人员,帮我用Swing开发一个员工信息管理界面,要求包含输入框,搜索按钮,表格,表格展示20个员工信息,并包含添加、修改、删除功能。*人事信息的管理界面:展示全部员工信息,根据名称查询某个员工信息展示,添加员工信息,删除员工信息,修改员工信息。系统中需要存在用户信息,先开发注册,注册一些用户信息。中去,则后者就可以调用信息界面对象中的方法,在方法里加载到信息
系统温习——黑马程序员Java+AI智能辅助编程全套视频教程
面向对象高级
代码块
代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为静态代码块和实例代码块。
静态代码块:
格式:static{ }
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
作用:完成类的初始化,例如:对静态变量的初始化赋值。
实例代码块:
格式:{ }
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对象的初始化,例如:对实例变量进行初始化赋值。
内部类
如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
成员内部类:无static修饰,属于外部类的对象持有的。
成员内部类创建对象的格式:外部类名称.内部类名称 对象名 = new 外部类名称( ).new 内部类名称( )。
成员内部类中可以直接访问外部类的静态成员,也可以直接访问外部类的实例成员。
成员内部类的实例方法中,可以直接拿到当前寄生的外部类对象:外部类名.this
静态内部类:有static修饰的内部类,属于外部类自己持有。
外部类名.内部类名 对象名 = new 外部类.内部类(...);
静态内部类可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
局部内部类:定义在方法中、代码块中、构造器等执行体中。
匿名内部类:一种特殊的局部内部类。所谓匿名指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。
特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

作用:用于更方便地创建一个子类对象。
匿名内部类在开发中的常见形式:通常作为一个对象参数传输给方法。

匿名内部类在开发中的真实使用场景:
调用别人提供的方法实现需求时,这个方法正好可以让我们传输一个匿名内部类对象给其使用。

使用comparator接口的匿名内部类实现对数组进行排序

sort方法内部会调用匿名内部类对象的compare方法,对数组中的学生对象进行两两比较,从而实现排序。
函数式编程
函数式编程è使用Lambda函数替代那些匿名内部类对象。
函数式编程的好处è让程序代码更简洁,可读性更好。

Lambda代表函数
Lambda表达式只能替代并简化函数式接口的匿名内部类。
函数式接口:有且仅有一个抽象方法的接口.
使用Lambda表达式省略的依据:可以根据上下文推断出省略的部分。
@Functionalinterface注解用于约束当前接口必须是函数式接口。


Lambda表达式的省略规则:
作用:用于进一步简化Lambda表达式的写法。
具体规则:
①参数类型全部可以省略不写。
②如果只有一个参数,参数类型省略的同时可以同时省略” () ”,但多个参数不能省略” () ”。
③如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号” ; ” 如果这行代码是return语句,也必须去掉return。


方法引用:简化Lambda
静态方法引用: 类名::静态方法
使用场景:如果某个Lambda表达式里只是调用一个静态方法,并且“->”前后参数的形式一致,就可以使用静态方法引用。

实例方法引用: 对象名::实例方法
使用场景:如果某个Lambda表达式里只是通过对象名称调用一个实例方法,并且“->”前后参数的形式一致,就可以使用实例方法引用。

特定类型方法的引用: 特定类的名称::方法名
使用场景:如果某个Lambda表达式里只是调用一个特定类型的实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。


构造器引用:类名::new
使用场景:如果某个Lambda表达式里只是在创建对象,并且”->”前后参数情况一致,就可以使用构造器引用。

常用API
String:String代表字符串,它的对象可以封装字符串数据,并提供了很多方法完成对字符串的处理。
String创建字符串对象的方式:①Java程序中的所有字符串文字即“xxx”都为此类的对象。②调用String类的构造器初始化字符串对象。

String创建对象的区别:只要以“...”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份;通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。

String提供的常用方法:

字符串对象的内容比较,千万不要用==,==默认比较地址,字符串对象的内容一样时地址不一定一样。判断字符串内容用String提供的equals方法,只关心内容是否一样,不关心地址。
开发验证码
①定义2个字符串变量:1个用来记住生成的验证码,1个用来记住要用到的全部字符
②定义for循环控制生成多少位随机字符,每次得到一个字符范围内的随机索引,根据索引提取该字符,把该字符交给code变量连接起来,循环结束后,在循环外返回code即可。
③主程序中,调用该方法即可得到随机验证码。
集合是一种容器,用来装数据的,类似于数组。
数组定义完成并启动后,长度就固定了。集合大小可变,功能丰富,开发用得更多。

创建ArrayList对象,代表一个集合容器;调用ArrayList提供的方法,对容器中的数据进行增删改查操作。
ArrayList是集合中最常用的一种,ArrayList是泛型类,可以约束存储的数据类型。
GUI编程
GUI:图形用户界面。通过图形元素(如窗口、按钮、文本框等)与用户进行交互。
Java的GUI编程包:AWT — 提供了一组原生的GUI组件,依赖于操作系统的本地窗口系统;Swing基于AWT,提供了更丰富的GUI组件,轻量级组件,不依赖于本地窗口系统。
布局管理器它们可以决定组件在容器中的布局方式,避免了手动设置每个组件的位置和大小,从而简化了GUI设计过程。
FlowLayout是最简单的布局管理器,按水平方向从左到右排列组件,当一行排满时,自动切换到下一行。默认居中对齐,可设置左对齐或右对齐。适用于简单排列的场景.
BorderLayout将容器划分为五个区域:东、南、西、北、中。每个区域只能添加一个组件,未添加组件的区域保持空白。适合需要在特定区域布局组件的场景;中间区域会占据所有剩余的空间。
GridLayout将容器划分为等大小的网格,每个网格中可以添加一个组件,所有组件大小相同。适用于需要均匀排列组件的场景,行和列的数量可以指定。
BoxLayout能够沿着单一轴线(X轴或Y轴)排列组件。可以创建水平或垂直的布局。适用于需要沿单一方向排列组件的场景。可以通过添加垂直或水平间隔来调整组件间隔。
GUI编程中,事件的处理是通过事件监听器来完成的。
常用的事件监听器对象:点击事件监听器、按键事件监听器、鼠标行为监听器。
给按键绑定点击事件监听器对象;给jf窗口整体绑定按键事件监听器对象。
e是事件对象,封装了事件相关信息。
为窗口绑定按键事件监听器但窗口被其他组件覆盖而无法占用焦点时需要将窗口设置为焦点。
事件的几种常见写法:
①直接提供实现类,用于创建事件监听对象。
②直接使用匿名内部类的对象,代表事件监听对象。
③自定义窗口,让窗口对象实现事件接口。 一个窗口对应一个类对象

结合AI使用GUI编程实现人事管理系统
①创建模块做项目。 worker-administration
②分析项目的业务需求
*登录和注册用户的界面
*人事信息的管理界面:展示全部员工信息,根据名称查询某个员工信息展示,添加员工信息,删除员工信息,修改员工信息。
*分析项目的角色:
-登录用户:登录名称、密码
-员工信息:ID、姓名、性别、年龄、电话、职位、入职时间、薪水、部门信息。
*分析系统的界面:
-登录界面类:创建登录界面。
-信息管理界面类:创建管理界面
③结合AI开始开发:通义千问
*AI生成登录界面
AI Prompt:我是一名Java开发人员,帮我用Swing开发一个登录界面,要求登录界面看起来比较美观,你可以用一些样式让界面好看一点。登录处放置两个按钮,一个登录,一个注册
自定义一个类作为登录界面;将界面初始化操作放在构造器内进行;将核心组件全部设置为成员变量使得这些组件在该类中成为全局变量。
*AI生成一个信息管理界面
AI Prompt:我是一名Java开发人员,帮我用Swing开发一个员工信息管理界面,要求包含输入框,搜索按钮,表格,表格展示20个员工信息,并包含添加、修改、删除功能。要求如下:1、输入框和搜索按钮、添加按钮占第一行并且居中 2、中间展示表格 3、每行数据右键绑定一个菜单,菜单展示修改和删除按钮。表格不可编辑。给编辑和删除菜单绑定事件,要求点击时拿到当前所在行的ID值。
正式开发
1. 拿到登陆界面的程序,并进行了修改。
在src目录下定义了一个App的启动类
2. 拿到管理信息的界面
改造成自定义的信息管理界面(目前页面中的数据均为假数据)

3. 准备系统的角色类:用户类、员工信息类。
4. 开发登录功能
系统中需要存在用户信息,先开发注册,注册一些用户信息。可以在系统中直接准备一些用户对象,作为正确的用户信息。
准备一个静态的集合容器,存储系统中全部的用户信息。
//定义一个静态的集合,存储系统中全部的用户对象信息
private static ArrayList<User> allUsers = new ArrayList<>();
//初始化几个测试的用户对象信息,作为登录用
static {
allUsers.add(new User("admin", "123456", "王二狗"));
allUsers.add(new User("admin2", "123456", "王哈哈"));
allUsers.add(new User("admin3", "123456", "王大锤"));
}
开发步骤:
①给登录按钮绑定一个点击事件监听器
②一旦点击登录按钮,拿到输入框输入的用户名和密码
③去集合中看是否存在这个用户对象,如果认证通过,跳转到信息管理界面。登录失败,弹出提示。
让窗口类去实现监听事件接口,重写监听方法。
监听方法可能是登录按钮点击过来的,也可能是注册按钮点击过来的。需要判断到底是点击了哪个按钮。通过拿到事件参数来判断触发点击事件的按钮是哪一个。
判断后分别开发登录和注册的业务。注意独立功能要独立成方法。
private void login() {
//1、获取用户输入的账号和密码
String loginName = loginNameFiled.getText();
String password = new String(passField.getPassword());
//2、遍历集合,判断用户输入的账号和密码是否和集合中的账号和密码一致,匹配成功则登录成功
//3、根据登录名称去查询用户对象返回。查询到用户对象则登录成功,否则登录失败
User user = queryUserByLoginName(loginName); //登录名称查询用户对象
if (user != null && user.getPassword().equals(password)) {
System.out.println("登录成功!");
new EmployeeManagementUI(); // 启动员工管理界面
this.dispose(); // 关闭当前窗口
}
else {
System.out.println("登录失败!");
}
}
5. 完成信息管理界面的功能开发(核心功能)
①登录成功后,把登录成功的用户名传给信息管理界面:通过在信息管理界面类中添加有参构造器实现。
②添加员工信息的功能。
- 准备一个静态的集合,用于存储系统中全部的员工信息
- 给添加按钮绑定点击事件
- 点击添加按钮后,弹出一个添加员工信息的界面
- 把员工信息封装成一个员工对象,存入到系统集合中去,然后刷新表格,展示最新添加的数据
添加员工信息界面:
//添加员工信息的界面
public class AddEmployeeUI extends JFrame {
public AddEmployeeUI() {
//初始化界面;提供很多输入框信息
//"ID","姓名","性别","年龄","电话","职位","入职时间","薪水","部门"
//提供一个添加按钮和一个取消按钮
}
}
交给ai,并给提示词:我现在点击了添加员工的按钮调用到这个界面,请补全代码,界面优美一点。
对象回调:从信息界面跳转到添加员工界面时,把信息界面这个对象当作参数送到添加员工界面中去,则后者就可以调用信息界面对象中的方法,在方法里加载到信息界面的集合,渲染到表格中。
6. 删除某行数据
①拿到当前右键要删除的这一行数据的id值。
②用id去集合中删除这个员工对象,把数据抹掉。
③从界面上抹掉这一行数据。刷新。
int id = (Integer) tableModel.getValueAt(rightClickedRow, 0); // 获取 ID
//通过遍历的方式从集合中删除该员工对象
for (int i = 0; i < allEmployees.size(); i++) {
Employee employee = allEmployees.get(i);
if (employee.getId() == id) {
allEmployees.remove(i);
break;
}
}
//删除表格中的行
tableModel.removeRow(rightClickedRow);
更多推荐


所有评论(0)