201871010107-公海瑜《面向对象程序设计(java)》第十二周学习总结

      201871010107-公海瑜《面向对象程序设计(java)》第十二周学习总结

             项目                                内容
   这个作业属于哪个课程     https://www.cnblogs.com/nwnu-daizh/
   这个作业的要求在哪里   https://www.cnblogs.com/nwnu-daizh/p/11867214.html  
   作业学习目标

  (1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API;

  (2)  掌握ArrayList、LinkList两个类的用途及常用API;

  (3) 了解java集合框架体系组成;

  (4) 掌握Java GUI中框架创建及属性设置中常用类的API;

  (5) 了解Java GUI中2D图形绘制常用类的API;

第一部分:总结第九章、第十章理论知识

集合

1.数据结构介绍

l 一般将数据结构分为两大类:线性数据结构和非线性数据结构。

l 线性数据结构:线性表、栈、队列、串、数组和文件。

l 非线性数据结构:树和图。 

A.线性表     单向链表 循环链表 双向循环链表

B.栈(Stack)

C.队列(Queue)

D.散列表

2.JAVA的集合框架

l JAVA的集合框架实现对各种数据结构的封装,以降低对数据管理与处理的难度。

l 所谓框架就是一个类库的集合,框架中包含很多超类,编程者创建这些超类的子类可较方便的设计设计程序所需的类。例如:Swing类包

l 集合(Collection或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成。

l 集合框架:JAVA集合类库的统一架构。

1)集合类的作用

l 集合类的作用: 

– Java的集合类提供了一些基本数据结构的支持。

– 例如Vector、Hashtable、Stack等。

l 集合类的使用:

– Java的集合类包含在java.util包中。

– import java.util.*;

2)集合类的特点

l 特点一:

– 只容纳对象。

注意:数组可以容纳基本数据类型数据和对象。

– 如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。

l 特点二: 

– 集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,这样设计的目的是为了集合类的通用性。

– 因为Object类是所有类的祖先,所以可以在这些集合中存放任何类的对象而不受限制,但切记在使用集合成员之前必须对它重新造型。

3. 新旧集合类

Vector类

Stack类

Hashtable类

集合框架中的基本接口

l Collection:集合层次中的根接口,JDK未提供这个接口的直接实现类。

l Set:不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set。

l List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。

l Map:包含了key-value对。Map不能包含重复的key。

l SortedMap是一个按照升序排列key的Map。

4.AWT与Swing简介

用户界面(User Interface)

– 用户与计算机系统(各种程序)交互的接口

图形用户界面(Graphical User Interface)

– 以图形方式呈现的用户界面

AWT

Java 的 抽 象 窗 口 工 具 箱 ( Abstract WindowToolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类。

AWT库处理用户界面元素的方法:把图形元素的创建和行为委托给本地GUI工具箱进行处理。

应用AWT编写依赖于本地用户界面元素GUI会暴露出一些缺陷。例如,菜单、滚动条和文本域这些用户界面元素,在不同的平台上,操作行为上存在一些微妙的差异。

Swing

l Swing用户界面库是非基于对等体的GUI工具箱。

l Swing具有更丰富并且更方便的用户界面元素集合。

l Swing对底层平台的依赖很少,因此与平台相关的bug很少。

l Swing会带来交叉平台上的统一视觉体验。

l Swing类库被放在javax.swing包里。

AWT与Swing的关系

l 大部分AWT组件都有其Swing的等价组件。

l Swing组件的名字一般是在AWT组件名前面添加一个字母“J”,如:JButton,JFrame,JPanel等

5.框架的创建

1)组件

构成图形用户界面的元素,拿来即用

l 用图形表示(能在屏幕上显示,能和用户进行交互)

– Button、Checkbox、Scrollbar、Choice、Frame

l 通常把由Component类的子类或间接子类创建的

对象称为一组件

2)容器

l 容器是Java中能容纳和排列组件的组件。

l 常用的容器是框架(Frame,JFrame)

3)添加组件

Container类提供了一个方法add(),用来在容器类组件对象中添加其他组件。

容器本身也是一个组件,可以把一个容器添加到另一个容器里,

4)框架(Frame)

l 在Java中,常采用框架(Frame)创建初始界面,即GUI的顶层窗口

5)在组件中显示信息

①Jframe的结构,它由根面板、层级面板、玻璃面板和 内容面板(content pane)四层面板构成。Swing程序员最关心的是内容面板,也称为内容窗格。

②在AWT中可调用add()方法把组件直接添加到AWT Frame中,在Swing中组件则添加到内容窗格里。

第二部分:实验部分

实验1: 导入第9章示例程序,测试程序并进行代码注释。

测试程序1:

l 使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;

l 掌握Vetor、Stack、Hashtable三个类的用途及常用API。 

//示例程序1
import java.util.Vector;
class Cat {
     private int catNumber;
     Cat(int i) {
        catNumber = i;
    }
     void print() {
        System.out.println("Cat #" + catNumber);
     }
}
public class Cats{
public static void main(String[] args){
       Vector<Cat> cats= new Vector<Cat>();
       for(int i=0; i<7; i++)
           cats.addElement(new Cat(i)); 
       for(int i=0; i<cats.size(); i++)
           (cats.elementAt(i)).print();
   }
}

运行结果:

//示例程序2
import java.util.*;
public class Stacks
{
   static String[] months={"","","",""};
   public static void main(String[] args){
      Stack<String> stk = new Stack<String> ();
      for(int i=0; i<months.length; i++)
          stk.push(months[i]);//放入一个i值
      System.out.println(stk);
      System.out.println("element 2=" + stk.elementAt(2));//element表示一个节点
while(!stk.empty()) System.out.println(stk.pop()); } }

运行结果:

//示例程序3
import java.util.*;
class Counter {
    int i = 1;
    public String toString() {
        return Integer.toString(i);
    }
}

public class Statistics {
    public static void main(String[] args) {
        Hashtable ht = new Hashtable();//生成集合类Hashtable
for (int i = 0; i < 10000; i++) { Integer r = new Integer((int) (Math.random() * 20)); //随机生成实数定义为整型
if(ht.containsKey(r)) ((Counter)ht.get(r)).i++;//用来判断r是否为一个间值
else ht.put(r, new Counter()); } System.out.println(ht); } }

运行结果:

 

测试程序2

l 使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;

ArrayListDemo代码如下:
import java.util.*;

public class ArrayListDemo {
    public static void main(String[] argv) {
        ArrayList al = new ArrayList();
         //用Add来添加对象且可以重载
        // Add lots of elements to the ArrayList...
        al.add(new Integer(11));
        al.add(new Integer(12));
        al.add(new Integer(13));
        al.add(new String("hello"));
        // 首先使用for循环将它们打印出来。
        System.out.println("Retrieving by index:");
        for (int i = 0; i < al.size(); i++) {
            System.out.println("Element " + i + " = " + al.get(i));
        }
     }
}

运行结果:

 

 

 LinkedListDemo代码如下:

import java.util.*;
public class LinkedListDemo {
    public static void main(String[] argv) {
        LinkedList l = new LinkedList();
        l.add(new Object());
        l.add("Hello");
        l.add("zhangsan");  //add方法可以重载
        ListIterator li = l.listIterator(0);  //迭代器生成li对象
        while (li.hasNext())
            System.out.println(li.next());
        if (l.indexOf("Hello") < 0)   //生成循环语句判断最后结果 
            System.err.println("Lookup does not work");
        else
            System.err.println("Lookup works");
   }
}

运行结果:

 

测试程序3

 在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;

 l 掌握ArrayList、LinkList两个类的用途及常用API。

程序代码如下:

package linkedList;

import java.util.*;

/**
 * This program demonstrates operations on linked lists.
 * @version 1.12 2018-04-10
 * @author Cay Horstmann
 */
public class LinkedListTest
{
   public static void main(String[] args)
   {
      //创建a和b两个链表
      List<String> a = new LinkedList<>();
      a.add("Amy");
      a.add("Carl");
      a.add("Erica");

      List<String> b = new LinkedList<>();
      b.add("Bob");
      b.add("Doug");
      b.add("Frances");
      b.add("Gloria");

      //把b和a合并

      ListIterator<String> aIter = a.listIterator();
      Iterator<String> bIter = b.iterator();

      while (bIter.hasNext())
      {
         if (aIter.hasNext()) aIter.next();
         aIter.add(bIter.next());
      }

      System.out.println(a);

      // 删除b中的每两个单词

      bIter = b.iterator();
      while (bIter.hasNext())
      {
         bIter.next(); // 跳过一个元素
         if (bIter.hasNext())
         {
            bIter.next(); // 跳过下一个元素
            bIter.remove(); // 删除该元素
         }
      }

      System.out.println(b);

      // 批量操作:从a中删除b中的所有单词

      a.removeAll(b);

      System.out.println(a);
   }
}

运行结果:

 

实验2导入第10示例程序,测试程序并进行代码注释。

测试程序1:

运行下列程序,观察程序运行结果。

import javax.swing.*;
public class SimpleFrameTest
{
   public static void main(String[] args)
   {
     JFrame  frame = new JFrame(); 
     frame.setBounds(0, 0,300, 200);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setVisible(true);    
   }
}

运行结果:

 

      elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;

l 掌握空框架创建方法;

l 了解主线程与事件分派线程概念;

l 掌握GUI顶层窗口创建技术。

程序代码如下:

package simpleFrame;

import java.awt.*;
import javax.swing.*;

/**
 * @version 1.34 2018-04-10
 * @author Cay Horstmann
 */
public class SimpleFrameTest
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(() ->
      {
          SimpleFrame frame = new SimpleFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);  //设置用户是否能调整框架大小 
       })y;
     
 }
}
                    
class SimpleFrame extends JFrame
{
   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;

   public SimpleFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
   }
}

运行结果:

测试程序2:

 elipse IDE中调试运行教材412页程序10-2,结合运行结果理解程序;

 掌握确定框架常用属性的设置方法。

程  程序代码如下:

 

package sizedFrame;

import java.awt.*;
import javax.swing.*;

/**
 * @version 1.35 2018-04-10
 * @author Cay Horstmann
 */
public class SizedFrameTest
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(() ->  //lambda表达式:通过线程开启一个队列
         {
            var frame = new SizedFrame();
            frame.setTitle("SizedFrame");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
         });
   }
}

class SizedFrame extends JFrame
{
   public SizedFrame()
   {
      // 获得Dimension的大小

      Toolkit kit = Toolkit.getDefaultToolkit();
      Dimension screenSize = kit.getScreenSize();
      int screenHeight = screenSize.height;
      int screenWidth = screenSize.width;

     // 确定框架的大小,以及在屏幕上的位置

      setSize(screenWidth / 2, screenHeight / 2);
      setLocationByPlatform(true);

     // 将图像设置为框架的图标


      Image img = new ImageIcon("icon.gif").getImage();
      setIconImage(img);      
   }
}

yu运行结果:

测试程序3:

l 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;

l 掌握在框架中添加组件;

掌握自定义组件的用法。

程序代码如下:

package notHelloWorld;

import javax.swing.*;
import java.awt.*;

/**
 * @version 1.34 2018-04-10
 * @author Cay Horstmann
 */
public class NotHelloWorld
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(() ->
         {
            var frame = new NotHelloWorldFrame();
            frame.setTitle("NotHelloWorld");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
         });
   }
}

/**
 * A frame that contains a message panel.
 */
class NotHelloWorldFrame extends JFrame
{
   public NotHelloWorldFrame()
   {
      add(new NotHelloWorldComponent());  //添加窗口
      pack();
   }
}

/**
 * A component that displays a message.
 */
class NotHelloWorldComponent extends JComponent
{
   public static final int MESSAGE_X = 75;
   public static final int MESSAGE_Y = 100;

   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;

   public void paintComponent(Graphics g)  //绘图
   {
      g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
   }

   public Dimension getPreferredSize() 
   {  
      return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
   }
}

运行结果:

 

 

三、实验总结

     通过本周的学习,我更深层次地掌握了数据结构方面的知识,并且对图形用户界面的知识有了一定的了解。在课堂上,我初步了解了绘制图形的常用API以及如何设置字体和颜色,因为上个学期有过这方面知识的学习,所里理解起来并不是特别困难,但课后还是需要多加巩固练习。其次是编程方面还是有一定的困难,以后要继续练习。

 

posted @ 2019-11-18 17:11  公海瑜-201871010107  阅读(141)  评论(1编辑  收藏  举报