Java第七次作业 李新磊
Java第七次作业--图形用户界面
(一)学习总结
1.写出事件处理模型中的几个关键词,并通过具体代码实例说明你对事件处理模型的理解。
addActionListener:在进行某一个操作的时候触发某项功能。
addActionListener:用于接收操作事件的监听器接口。
ActionEvent:按下按钮、在文本框中回车、双击一个列表项或选中某个菜单时发生
private JButton addBtn = new JButton("添加宠物");//添加“添加宠物”按钮
addBtn.setBounds(460, 280, 90, 25);
this.add(addBtn);
......
private void addListener() {
//添加按钮监听
addBtn.addActionListener(new ActionListener(){ //添加监听器,按下“添加宠物”按钮时,实现添加功能
public void actionPerformed(ActionEvent e){ //actionPerformed:用于接收操作事件的侦听器接口 ActionEvent:按下addBtn(添加宠物)按钮时发生
addPetItem(); //调用添加方法
}
});
}
2.JTextArea与TextArea自动换行和滚动条的对比
1.自动换行
- JTextArea自动换行代码:
JTextArea jtextArea = new JTextArea(); // 新建jtextArea
jtextArea.setLineWrap(true); //实现自动换行
- TextArea,在创建文本区时直接设置TextArea.SCROLLBARS_VERTICAL_ONLY,意为仅垂直方向设置,达到了自动换行的效果;
如果通过TextArea的其他构造方法,创建出来的文本区是含垂直和水平两个方向的滚动条,不支持自动换行
TextArea textArea = new TextArea("", 20, 43, TextArea.SCROLLBARS_VERTICAL_ONLY); // 创建文本区
```
#### 2.滚动条
- JTextArea添加滚动条(JScrollPane)代码:
JScrollPane scrollPane = new JScrollPane(textArea); //创建滚动条,需要指定添加位置
scrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //设置滚动条的形式
- TextArea 默认自带滚动条(默认为SCROLLBARS_BOTH),如果不用滚动条,把 TextArea.SCROLLBARS_VERTICAL_ONLY 改为 SCROLLBARS_NONE
## (二)实验总结
### 程序设计思路
- 设计一个欢迎界面、登录界面、用户注册界面、管理员界面、用户界面;程序启动时显示欢迎界面,欢迎界面有管理员登录、用户登录、用户注册3个按钮;
- 如果用户选择管理员登录按钮,则进入登录界面:用户输入用户名、密码,输入正确后进入管理员界面:管理员界面包括添加、修改、删除三个按钮,分别实现添加、修改、删除功能;
- 如果用户选择用户登录按钮,则进入登录界面:用户输入用户名、密码,输入正确后进入用户界面:用户界面包括购买、查找、显示所有购买三个按钮,分别实现购买、查找、显示所有购买功能;
- 如果用户选择注册按钮,则进入注册界面:用户输入注册信息(用户名、密码、邮箱、手机号),当输入格式正确并且用户名、邮箱、手机号不重复,则注册成功,进入登录界面
### 类图

### 问题1.注册界面与登录界面的设计
注册界面包括输入用户名、密码、确认密码、邮箱、手机号

输入信息后,点击“注册”按钮,执行监听器,实现判断格式功能和判断重复注册功能:如果格式不合格或重复注册,则提示用户重新注册;
如果信息合格且不重复,则进入用户登录界面。
public void judjeUserItem() {
String addName = addNameText.getText();
String addKey = addKeyText.getText();
String addKey2 = addKey2Text.getText();
String addEmail = addEmailText.getText();
String addNumber = addNumberText.getText();
int Success = registerServie.checkUserData(addKey, addKey2, addEmail, addNumber);//判断格式是否合格
int Success2 = registerServie.judjeUserData(addName,addEmail,addNumber); //判断是否重复注册
if(Success0&&Success20){ //当格式合格且不重复时,执行添加新用户功能,同事进入用户登录界面
addUserItem(); //将新注册的用户信息存入User数据库中
showSignDialog(); //显示用户登录界面
}else if(Success1){
//没有添加成功弹窗错误提示
JOptionPane.showMessageDialog(this, "密码不一致");
}else if(Success2){
JOptionPane.showMessageDialog(this, "手机号格式不合法");
}else if(Success3){
JOptionPane.showMessageDialog(this, "邮箱格式不合法");
}else if(Success21){
JOptionPane.showMessageDialog(this, "用户名已存在");
}else if(Success22){
JOptionPane.showMessageDialog(this, "邮箱已注册");
}else if(Success23){
JOptionPane.showMessageDialog(this, "手机号已注册");
}
}
//判断格式方法
public int checkUserData(String key,String key2,String email,String number){
if(!key.equals(key2)){
return 1;
}else{
}
String emailCheck="\w+@\w+.(com|cn|edu|net|gov|org)";
Pattern p2 = Pattern.compile(emailCheck);
Matcher m2 =p2.matcher(email);
if(m2.matches()){
}else{
return 3;
}
String phoneCheck="^(18|15|17|13)\d{9}$";
Pattern p1 = Pattern.compile(phoneCheck);
Matcher m1 =p1.matcher(number);
if(m1.matches()){
}else{
return 2;
}
return 0;
}
//判断重复注册方法
public int judjeUserData(String name,String email,String number){
ArrayList<UserItem> userData = queryUserItem();
for(int i = 0; i < userData.size();i++){
UserItem User = userData.get(i);
if(User.getName().equals(name)){
return 1;
}else if(User.getEmail().equals(email)){
return 2;
}else if(User.getNumber().equals(number)){
return 3;
}
}
return 0;
}
用户登录界面包括输入用户名、密码功能,当用户点击“登录”按钮时,执行监听器,判断用户名和密码是否正确,如果错误,提示重新输入;
如果正确,则进入用户界面

public void findUserItem(){
String addName = addNameText.getText();
String addKey = addKeyText.getText();
boolean Success = signServie. findUserData(addName,addKey);//判断用户名和密码是否正确
if(Success){
showUserDialog(); //显示用户界面
}else{
JOptionPane.showMessageDialog(this, "用户名或密码错误");
}
}
### 问题2.用户界面的设计
管理员界面包括显示宠物列表、添加宠物、修改宠物信息、删除宠物功能,当管理员执行操作时,监听器同时执行;
当操作无误时,宠物信息数据库更新,同时界面重新显示更改后的宠物列表。

用户界面包括购买宠物、按品种查找宠物、显示购买的所有宠物信息功能,当用户执行操作时,监听器同时执行;
当操作无误时,宠物信息数据库更新,同时界面重新显示更改后的宠物列表;
界面下方的文本框同时显示操作信息。

//购买方法
public void buyPetItem() {
String buyId = buyIdText.getText();
boolean buySuccess = userService.buyPetItem(buyId);
String output = userService.outputBuyPetItem(buyId);//判断是否购买成功
if(buySuccess){
queryPetItem(); //购买后刷新表格
buyIdText.setText("");
show.append(output+"\n"); //购买后,在文本框输出购买的宠物信息
}else{
//没有添加成功弹窗错误提示
JOptionPane.showMessageDialog(this, "没有这个宠物");
}
}
//查找方法
public void findPetItem() {
String findKind = findKindText.getText();
boolean findSuccess = userService.findPetItem(findKind);//判断是否查找成功
String output = userService.outputFindPetItem(findKind);
if(findSuccess){
show.append(output+"\n");
findKindText.setText(""); //查找后,在文本框输出购买的宠物信息
}else{
JOptionPane.showMessageDialog(this, "没有这个品种的宠物");
}
}
//显示方法
public void showPetItem() {
boolean showSuccess = userService.showBuyItem();//判断是否显示成功(已购买宠物类集内有无数据)
if(showSuccess){
userService.outputShowBuyItem(); //调用显示所有购买方法
}else{
JOptionPane.showMessageDialog(this, "您未购买宠物");
}
}
### 问题3.购买宠物、查找宠物功能的实现
购买宠物后,需要将宠物数量减一,并且将购买的这个宠物的信息输出在文本框中
//购买服务
public boolean buyPetItem(String id){
ArrayList
for(int i = 0; i < data.size();i++){
PetItem Pet = data.get(i);
if(Pet.getId().equals(id)&&Pet.getNumber()>0){
PetItem thisPet = new PetItem(id,Pet.getKind(),Pet.getPrice(),Pet.getAge(),(Pet.getNumber()-1));//购买后的宠物,数量减1,相当于给该宠物信息做了修改
BuyItem thisBuy = new BuyItem(Pet.getKind(),Pet.getPrice());
adminDao.delPetItem(id); //删除原有的宠物信息
adminDao.addPetItem(thisPet); //存入修改后的宠物信息
adminDao.addBuyItem(thisBuy);
return true;
}
}
return false;
}
//当购买成功时,输出购买信息
public String outputBuyPetItem(String id) {
ArrayList<PetItem> data = queryPetItem();
for(int i = 0; i < data.size();i++){
PetItem Pet = data.get(i);
if(Pet.getId().equals(id)){
return "您购买的宠物:"+"编号:"+Pet.getId()+" 品种:"+Pet.getKind()+" 价格:"+Pet.getPrice()+" 年龄:"+Pet.getAge();
}
}
return "没有这个宠物";
}
按照宠物品种查找宠物信息,查找成功时,在文本框中输出宠物信息
//查找服务
public boolean findPetItem(String kind){
ArrayList<PetItem> data = queryPetItem();
for(int i = 0; i < data.size();i++){
PetItem Pet = data.get(i);
if(Pet.getKind().equals(kind)){ //遍历宠物类集,查找有无该品种的宠物
return true;
}
}
return false;
}
//当查找成功时,输出查找信息
public String outputFindPetItem(String kind) {
ArrayList<PetItem> data = queryPetItem();
for(int i = 0; i < data.size();i++){
PetItem Pet = data.get(i);
if(Pet.getKind().equals(kind)){ //遍历宠物类集,找到该品种的宠物,输出宠物信息
return "编号:"+Pet.getId()+" 品种:"+Pet.getKind()+" 价格:"+Pet.getPrice()+" 年龄:"+Pet.getAge()+" 数量:"+Pet.getNumber();
}
}
return "没有这个品种";
}
### 问题4.显示购买的所有宠物的品种、数量、总价
设计一个已购买的宠物类、已购买宠物数据库,将已购买宠物信息存储在其中
public class BuyDataBase {
public static ArrayList
}
每次购买宠物时,将宠物信息存储到已购买宠物数据库中
//购买服务
public boolean buyPetItem(String id){
ArrayList
for(int i = 0; i < data.size();i++){
PetItem Pet = data.get(i);
if(Pet.getId().equals(id)&&Pet.getNumber()>0){
adminDao.delPetItem(id);
PetItem thisPet = new PetItem(id,Pet.getKind(),Pet.getPrice(),Pet.getAge(),(Pet.getNumber()-1));
BuyItem thisBuy = new BuyItem(Pet.getKind(),Pet.getPrice());
adminDao.addPetItem(thisPet);
adminDao.addBuyItem(thisBuy); //将购买的宠物添加到已购买宠物数据库中
return true;
}
}
return false;
}
输出所有已购买的宠物的品种、单价、总数、总价
//显示服务
public boolean showBuyItem(){
ArrayList
if(data.size()>0){
return true;
}
return false;
}
//当可以显示时,输出显示
public void outputShowBuyItem(){
ArrayList<BuyItem> data = queryBuyItem();
double sum=0.0;
for(int i = 0; i < data.size();i++){
BuyItem Buy = data.get(i); //输出所有购买宠物的品种和单价
sum+=Buy.getPrice();
UserDialog.show.append("您已购买"+" 品种:"+Buy.getKind()+" 价格:"+Buy.getPrice()+"\n");
}
UserDialog.show.append("总数 :"+data.size()+" 总价:"+sum+"\n"); //输出购买宠物的总数和总价
}
## (三)代码托管
https://git.oschina.net/hebau_cs15/Java-CS02lxl/tree/master/
- **请下载压缩文件**

浙公网安备 33010602011771号