第七次Java作业

时间:2022-08-23 21:56:47

《Java技术》第七次作业

(一)学习总结

1. 学习总结

  • 事件处理
  • java事件处理是采取“委派事件模型”。为了让事件源知道要把事件传递给哪一个“事件监听者”,必需先把“事件监听者”在事件源注册。
  • 事件:事件就是承载事件源状态改变时的信息对象。java.awt.event包和javax.swing.event包中定义了各种事件类,类名以Event结尾
    第七次Java作业

  • 事件处理步骤
    确定事件源->确定事件源->确定事件监听器接口,实现接口->覆盖监听器接口中的适当方法->事件源注册监听器
  • 使用内部类进行事件处理

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    class windows{
    class date extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
    System.out.println("退出系统!");
    System.exit(0);
    }
    }
    }
    public class Test3 {
    public static void main(String[] args) {
    JFrame frame = new JFrame("适配器测试");
    frame.setVisible(true);
    frame.setBounds(300, 150, 350, 350);
    JPanel btnPanel = new JPanel();
    frame.addWindowListener(new windows().new date());
    frame.setVisible(true);
    frame.setResizable(false); // 窗体大小固定
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
  • 使用匿名内部类进行事件处理

    import java.awt.*;
    import java.awt.event.*;
    class Test3 extends JFrame {
    private JButton but = new JButton("关闭窗口");
    // 构造方法
    public Test3() {
    init(); // 初始化
    addComponent(); // 添加组件
    addListener(); // 添加监听器
    }
    // 窗口初始化
    private void init() {
    this.setTitle("匿名内部类测试!");
    this.setBounds(300, 150, 350, 350);
    this.setVisible(true);
    this.setResizable(false); // 窗体大小固定
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    // 添加组件
    private void addComponent() {
    JPanel btnPanel = new JPanel();
    btnPanel.setLayout(null); // 清除JPanel的布局
    this.add(btnPanel); // 定义按钮边界位置
    btnPanel.add(but);
    but.setBounds(120, 140, 100, 40);
    }

    // 添加监听器
    private void addListener() {
    but.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    showAdminDialog();
    }
    });
    }
    // 实现监听器定义的方法
    public void showAdminDialog() {
    this.setVisible(false);
    }
    public static void main(String[] args){
    Test3 t = new Test3();
    }
    }
  • 使用监听适配器进行事件处理

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    class date extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
    System.out.println("退出系统!");
    System.exit(0);
    }
    }
    public class Test3 {
    public static void main(String[] args) {
    JFrame frame = new JFrame("适配器测试");
    frame.setVisible(true);
    frame.setBounds(300, 150, 350, 350);
    JPanel btnPanel = new JPanel();
    frame.addWindowListener(new date());
    frame.setVisible(true);
    frame.setResizable(false); // 窗体大小固定
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }

(二)实验总结

1. 宠物商店

实验内容:
基本要求:
使用GUI,编写一个宠物商店管理系统实现对宠物信息的统一管理。假设宠物种类有猫、狗,宠物信息包括:编号、品种、年龄、数量、价格。系统启动进入登录界面,登录成功进入管理界面,否则提出错误信息后退出系统。
在管理界面实现以下功能:
(1)显示所有宠物列表
(2)添加宠物到列表
(3)删除宠物
(4)对宠物信息进行修改
(5)退出
功能扩展:
用户分为管理员和普通用户两种,增加普通用户注册功能,增加普通用户界面。
实现以下功能:
(1)显示所有宠物
(2)能够按照品种对宠物进行查找
(3)购买宠物
(4)显示购买清单
(5)退出

  • 程序设计思路:
    先建立宠物和用户的属性类,database存储数据,tools类设置窗口,view包中设置所有窗口,并且将方法的类也放入。
  • 类图

第七次Java作业

  • 实验问题分析:
  • 问题1: 在database中存入数据时,无法进行两个类的区分
  • 解决方案:分开进行存储,声明两个集合。

        public static ArrayList<Pet> p = new ArrayList<Pet>();
    static {
    p.add(new Pet("1001", "白猫", "3", "19", "60"));
    p.add(new Pet("1002", "花猫", "2", "20", "80"));
    }
    public static ArrayList<User> u = new ArrayList<User>();
    static {
    try {
    u.add(new User("穆木", "12112", "12112", sdf.parse("1990-01-10"),
    "18123456789", "abc@aa.cn"));
    } catch (ParseException e) {
    e.printStackTrace();
    }
    }
  • 问题2: 点击按钮无法打开下一个窗口
  • 解决方案: 监听器未添加

        this.addListener(); // 添加监听器
  • 问题3: 查询时无法显示查找到的具体信息
  • 解决方案:利用.get()读取database中的数据

        public void lookPet() {
    ArrayList<Pet> dataList = userService.queryPet();
    String addPno = lookPnoText.getText();
    int addSuccess = UserService.lookPet(addPno);
    if (addSuccess != 0) {
    JOptionPane.showMessageDialog(this,
    "查找成功\n" +"编号:"+ dataList.get(addSuccess - 1).getPno()
    +" 品种:"+ dataList.get(addSuccess - 1).getName()
    +" 年龄:"+ dataList.get(addSuccess - 1).getAge()
    +" 价格:"+ dataList.get(addSuccess - 1).getPrice());
    } else {
    JOptionPane.showMessageDialog(this, "宠物编号不存在,请检查数据");
    }
    }

(三)代码托管

第七次Java作业

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 400/400 40/40 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。
第5周 450/850 45/85 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了。解单列设计模式 等知识点,还将ppt上的程序打了一遍。
第6周 300/1250 35/120 从课外书上更深的了解了抽象类,同学介绍的网站上面了解了类图的画法。
第7周 400/1250 40/160 对接口了解不够深,请同学给我讲了讲,翻资料找了些关于接口的程序去敲。
第10周 400/1650 40/200 在网上找了许多关于set\list\map接口的实例和用法详解。去学习去理解
第12周 350/2000 40/240 学习并掌握了本次学习内容