zoukankan      html  css  js  c++  java
  • 201871010101陈来弟《面向对象程序设计(Java)》第十二周学习总结 201871010101

    201871010101-陈来弟《面向对象程序设计(Java)》第十二周学习总结

                            

    实验十   集合与GUI初步

    实验时间 2019-11-14

    第一部分   理论部分

     

    1.(1) 用户界面(User Interface)用户与计算机系统(各种程序)交互的接口

    (2)图形用户界面(Graphical User Interface)以图形方式呈现的用户界面

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

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

    . 应用AWT编写依赖于本地用户界面元素GUI会暴露出一些缺陷。例如,菜单、滚动条和文本域这些

    用户界面元素,在不同的平台上,操作行为上存在一些微妙的差异。

    3.Swing:

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

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

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

     Swing会带来交叉平台上的统一视觉体验。
     Swing类库被放在javax.swing包里。

    4.AWT与Swing的关系

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

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

    二..创建框架

    1.组件:构成图形用户界面的元素,拿来即用用图形表示(能在屏幕上显示,能和用户进行交互)

    2.通常把由Component类的子类或间接子类创建的对象称为一个组件。

    3.容器:容器是Java中能容纳和排列组件的组件。常用的容器是框架(Frame,JFrame)

    例:Frame fra = new Frame(“这是一个窗口”);

    4.添加组件:

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

    容器本身也是一个组件,可以把一个容器添加到另一个容器里,实现容器嵌套。

    5.框架(Frame)的创建:

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

     AWT库中有一个基于对等体的Frame类。该类的Swing版本为JFrame,JFrame是Frame子类。

    (2)框架定位与框架属性:

    定位:
    —常用Component类的setLocation和setBounds方法
    常用属性
    —Title:框架标题
    —IconImage:框架图标

    (3)确定框架的大小:通过调用Toolkit类的方法来得到屏幕尺寸信息

    6.在组件中显示信息

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

    其中内容窗格是用来添加组件的,添加代码如下:

    Container contentPane = getContentPane();

    Component c=…;contentPane.add(c);. 用户也可以自行创建一个组件类,并在组件上进行绘制,此时需要重载paintComponent()。

    用户的自建组件也可添加到内容窗格里。

    . paintComponent(Graphics g)定义在JComponent类中,该方法在窗口需要重新绘图时(如扩大窗口或极小化窗口),被系统自动调用

    .. paintComponent()方法被调用时,系统就自动产生一个Graphics类型的参数,传递给paintComponent方法中的参数g。

    组件的激活与可见性:

    public void setEnabled(boolean b):设置组件是否可被激活。
    当参数b取值true时,组件可以被激活。
    当参数b取值false 时,组件不可激活。
    默认情况下,组件是可以被激活的。
    public void setVisible(boolean b):设置组件在该容器中的可见性。
    当b取值true时,组件在容器中可见。
    当b取值false时,组件在容器中不可见。
    除了Window型组件外,其它类型组件默认是可见的。

    第二部分:理论部分

    1、实验目的与要求

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

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

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

    (4) 应用结对编程(Pair programming),体验程序开发中的两人合作。

    2、实验内容和步骤

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

    测试程序1:

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

    掌握VetorStackHashtable三个类的用途及常用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]);

          System.out.println(stk);

          System.out.println("element 2=" + stk.elementAt(2));

          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();

    for (int i = 0; i < 10000; i++) {

    Integer r = new Integer((int) (Math.random() * 20));

    if(ht.containsKey(r))

                  ((Counter)ht.get(r)).i++;

              else

                  ht.put(r, new Counter());

    }

    System.out.println(ht);

    }

    }

     

    //示例程序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]);
          System.out.println(stk);
          System.out.println("element 2=" + stk.elementAt(2));
          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();
            for (int i = 0; i < 10000; i++) {
                Integer r = new Integer((int) (Math.random() * 20));
    if(ht.containsKey(r))
                  ((Counter)ht.get(r)).i++;
              else
                  ht.put(r, new Counter());
    }
            System.out.println(ht);
        }
    }

    示例三的运行结果:

      在命令行上面运行的结果如图:

     

    测试程序2:

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

    import java.util.*;

     

    public class ArrayListDemo {

    public static void main(String[] argv) {

    ArrayList al = new ArrayList();

    // 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"));

    // First print them out using a for loop.

    System.out.println("Retrieving by index:");

    for (int i = 0; i < al.size(); i++) {

    System.out.println("Element " + i + " = " + al.get(i));

    }

     }

    }

    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");

            ListIterator li = l.listIterator(0);

            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");

       }

    }

    import java.util.*;
    
     
    
    public class ArrayListDemo {
    
    public static void main(String[] argv) {
    
    ArrayList al = new ArrayList();
    
    // 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"));
    
    // First print them out using a for loop.
    
    System.out.println("Retrieving by index:");
    
    for (int i = 0; i < al.size(); i++) {
    
    System.out.println("Element " + i + " = " + al.get(i));
    
    }
    
     }
    
    }

    其上述代码的运行结果:

      在命令行上面运行的结果如图:

     

    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");
    
            ListIterator li = l.listIterator(0);
    
            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");
    
       }
    
    }

    其运行结果:

      在命令行上面运行的结果如图:

     

     

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

    掌握ArrayListLinkList两个类的用途及常用API

    9-1 代码:
    
    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)
       {
          LinkedList<String> a = new LinkedList<String>();
          a.add("Amy");
          a.add("Carl");
          a.add("Erica");
    
          LinkedList<String> b = new LinkedList<String>();
          b.add("Bob");
          b.add("Doug");
          b.add("Frances");
          b.add("Gloria");
    
          // merge the words from b into 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);
    
          // remove every second word from b
    
          bIter = b.iterator();
          while (bIter.hasNext())
          {
             bIter.next(); // skip one element
             if (bIter.hasNext())
             {
                bIter.next(); // skip next element
                bIter.remove(); // remove that element
             }
          }
    
          System.out.println(b);
    
          // bulk operation: remove all words in b from a
    
          a.removeAll(b);
    
          System.out.println(a);
       }
    }

    运行结果:

     

    LinkedList类
    LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
    注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

    List list = Collections.synchronizedList(new LinkedList(...));
     
    ArrayList类
    ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
    size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
    每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法 并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
    和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
                      

    实验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);    

       }

    }

    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);    
    
       }
    
    }

    运行结果:

     

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

    l 掌握空框架创建方法;

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

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

    10-1 代码:
    
    
    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);//设置窗口是否可见
             });
       }
    }
    
    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:

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

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

    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(() ->
             {
                SizedFrame frame = new SizedFrame();
                frame.setTitle("SizedFrame");//设置窗口的尺寸
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可控
                frame.setVisible(true);//设置窗口是否可见
             });
       }
    }
    
    class SizedFrame extends JFrame
    {
       public SizedFrame()
       {
          // get screen dimensions
    
          Toolkit kit = Toolkit.getDefaultToolkit();
          Dimension screenSize = kit.getScreenSize();
          int screenHeight = screenSize.height;
          int screenWidth = screenSize.width;
    
          // set frame width, height and let platform pick screen location
          //设置框架 宽度,高度,病并让平台拾取屏幕位置
          setSize(screenWidth / 2, screenHeight / 2);
          setLocationByPlatform(true);
    
          // set frame icon
    
          Image img = new ImageIcon("icon.gif").getImage();
          setIconImage(img);      
       }
    }

    运行结果:

     

    测试程序3:

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

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

    掌握自定义组件的用法。

    10-3 代码:
    
    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(() ->
             {
                NotHelloWorldFrame 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); 
       }
    }

    运行结果:

     

    第三部分:实验总结

             通过这次的课程设计的学习,我学到了Java中开发图形应用程序的常用控件、 熟悉了JAVA SWING中的容器、组件、布局以及事件监视器和事件接口的使用。通过该实验掌握了JAVA图形界面程序设计的方法。

    对如何创建框架,以及如何生成一个绘制图形的面板 ,以及如何在面板上绘制图形有了一定的了解,以及如何设置窗口中的字体,以及窗口的背景,还有字体大小字体颜色有了一定了解,通过对源码的查看,对如何设计窗口,以及窗口中的一些属性有了进一步的理解。

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/wing2438/p/11883369.html
Copyright © 2011-2022 走看看