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图形界面程序设计的方法。

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

  • 相关阅读:
    【转】PHP中文乱码的常见解决方法总结(GOOD)
    【转】Apache的安装与配置
    【转】PHP Notice: Undefined index: ... 问题的解决方法
    【转】方程的解数(哈希表的应用)
    【转】PHP Notice: undefined index 完美解决方法
    【转】如何修改IIS的默认端口号
    Apache配置(转载)
    BZOJ 1014 Splay+hash
    BZOJ 1045 环形均分纸牌
    BZOJ 1008 快速幂
  • 原文地址:https://www.cnblogs.com/wing2438/p/11883369.html
Copyright © 2011-2022 走看看