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. //示例程序1
  2.  
  3. import java.util.Vector;
  4.  
  5. class Cat {
  6.  
  7. private int catNumber;
  8.  
  9. Cat(int i) {
  10.  
  11. catNumber = i;
  12.  
  13. }
  14.  
  15. void print() {
  16.  
  17. System.out.println("Cat #" + catNumber);
  18.  
  19. }
  20.  
  21. }
  22.  
  23. public class Cats{
  24.  
  25. public static void main(String[] args){
  26.  
  27. Vector<Cat> cats= new Vector<Cat>();
  28.  
  29. for(int i=; i<; i++)
  30.  
  31. cats.addElement(new Cat(i));
  32.  
  33. for(int i=; i<cats.size(); i++)
  34.  
  35. (cats.elementAt(i)).print();
  36.  
  37. }
  38.  
  39. }

示例一的运行结果:

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

  1. //示例程序2
  2. import java.util.*;
  3. public class Stacks
  4. {
  5. static String[] months={"金","银","铜","铁"};
  6. public static void main(String[] args){
  7. Stack<String> stk = new Stack<String> ();
  8. for(int i=; i<months.length; i++)
  9. stk.push(months[i]);
  10. System.out.println(stk);
  11. System.out.println("element 2=" + stk.elementAt());
  12. while(!stk.empty())
  13. System.out.println(stk.pop());
  14. }
  15. }

示例二运行结果:

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

  1. //示例程序3
  2. import java.util.*;
  3. class Counter {
  4. int i = ;
  5. public String toString() {
  6. return Integer.toString(i);
  7. }
  8. }
  9.  
  10. public class Statistics {
  11. public static void main(String[] args) {
  12. Hashtable ht = new Hashtable();
  13. for (int i = ; i < ; i++) {
  14. Integer r = new Integer((int) (Math.random() * ));
  15. if(ht.containsKey(r))
  16. ((Counter)ht.get(r)).i++;
  17. else
  18. ht.put(r, new Counter());
  19. }
  20. System.out.println(ht);
  21. }
  22. }

示例三的运行结果:

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

测试程序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");

   }

}

  1. import java.util.*;
  2.  
  3. public class ArrayListDemo {
  4.  
  5. public static void main(String[] argv) {
  6.  
  7. ArrayList al = new ArrayList();
  8.  
  9. // Add lots of elements to the ArrayList...
  10.  
  11. al.add(new Integer());
  12.  
  13. al.add(new Integer());
  14.  
  15. al.add(new Integer());
  16.  
  17. al.add(new String("hello"));
  18.  
  19. // First print them out using a for loop.
  20.  
  21. System.out.println("Retrieving by index:");
  22.  
  23. for (int i = ; i < al.size(); i++) {
  24.  
  25. System.out.println("Element " + i + " = " + al.get(i));
  26.  
  27. }
  28.  
  29. }
  30.  
  31. }

其上述代码的运行结果:

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

  1. import java.util.*;
  2.  
  3. public class LinkedListDemo {
  4.  
  5. public static void main(String[] argv) {
  6.  
  7. LinkedList l = new LinkedList();
  8.  
  9. l.add(new Object());
  10.  
  11. l.add("Hello");
  12.  
  13. l.add("zhangsan");
  14.  
  15. ListIterator li = l.listIterator();
  16.  
  17. while (li.hasNext())
  18.  
  19. System.out.println(li.next());
  20.  
  21. if (l.indexOf("Hello") < )
  22.  
  23. System.err.println("Lookup does not work");
  24.  
  25. else
  26.  
  27. System.err.println("Lookup works");
  28.  
  29. }
  30.  
  31. }

其运行结果:

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

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

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

  1. - 代码:
  2.  
  3. package linkedList;
  4.  
  5. import java.util.*;
  6.  
  7. /**
  8. * This program demonstrates operations on linked lists.
  9. * @version 1.12 2018-04-10
  10. * @author Cay Horstmann
  11. */
  12. public class LinkedListTest
  13. {
  14. public static void main(String[] args)
  15. {
  16. LinkedList<String> a = new LinkedList<String>();
  17. a.add("Amy");
  18. a.add("Carl");
  19. a.add("Erica");
  20.  
  21. LinkedList<String> b = new LinkedList<String>();
  22. b.add("Bob");
  23. b.add("Doug");
  24. b.add("Frances");
  25. b.add("Gloria");
  26.  
  27. // merge the words from b into a
  28.  
  29. ListIterator<String> aIter = a.listIterator();
  30. Iterator<String> bIter = b.iterator();
  31.  
  32. while (bIter.hasNext())
  33. {
  34. if (aIter.hasNext()) aIter.next();
  35. aIter.add(bIter.next());
  36. }
  37.  
  38. System.out.println(a);
  39.  
  40. // remove every second word from b
  41.  
  42. bIter = b.iterator();
  43. while (bIter.hasNext())
  44. {
  45. bIter.next(); // skip one element
  46. if (bIter.hasNext())
  47. {
  48. bIter.next(); // skip next element
  49. bIter.remove(); // remove that element
  50. }
  51. }
  52.  
  53. System.out.println(b);
  54.  
  55. // bulk operation: remove all words in b from a
  56.  
  57. a.removeAll(b);
  58.  
  59. System.out.println(a);
  60. }
  61. }

运行结果:

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

}

}

  1. import javax.swing.*;
  2.  
  3. public class SimpleFrameTest
  4.  
  5. {
  6.  
  7. public static void main(String[] args)
  8.  
  9. {
  10.  
  11. JFrame frame = new JFrame();
  12.  
  13. frame.setBounds(, ,, );
  14.  
  15. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  16.  
  17. frame.setVisible(true);
  18.  
  19. }
  20.  
  21. }

运行结果:

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

l 掌握空框架创建方法;

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

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

  1. - 代码:
  2.  
  3. package simpleFrame;
  4.  
  5. import java.awt.*;
  6. import javax.swing.*;
  7.  
  8. /**
  9. * @version 1.34 2018-04-10
  10. * @author Cay Horstmann
  11. */
  12. public class SimpleFrameTest
  13. {
  14. public static void main(String[] args)
  15. {
  16. EventQueue.invokeLater(() ->
  17. {
  18. SimpleFrame frame = new SimpleFrame();
  19. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可控
  20. frame.setVisible(true);//设置窗口是否可见
  21. });
  22. }
  23. }
  24.  
  25. class SimpleFrame extends JFrame
  26. {
  27. private static final int DEFAULT_WIDTH = ;
  28. private static final int DEFAULT_HEIGHT = ;
  29.  
  30. public SimpleFrame()
  31. {
  32. setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  33. }
  34. }

其运行结果:

测试程序2:

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

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

  1. - 代码:
  2.  
  3. package sizedFrame;
  4.  
  5. import java.awt.*;
  6. import javax.swing.*;
  7.  
  8. /**
  9. * @version 1.35 2018-04-10
  10. * @author Cay Horstmann
  11. */
  12. public class SizedFrameTest
  13. {
  14. public static void main(String[] args)
  15. {
  16. EventQueue.invokeLater(() ->
  17. {
  18. SizedFrame frame = new SizedFrame();
  19. frame.setTitle("SizedFrame");//设置窗口的尺寸
  20. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可控
  21. frame.setVisible(true);//设置窗口是否可见
  22. });
  23. }
  24. }
  25.  
  26. class SizedFrame extends JFrame
  27. {
  28. public SizedFrame()
  29. {
  30. // get screen dimensions
  31.  
  32. Toolkit kit = Toolkit.getDefaultToolkit();
  33. Dimension screenSize = kit.getScreenSize();
  34. int screenHeight = screenSize.height;
  35. int screenWidth = screenSize.width;
  36.  
  37. // set frame width, height and let platform pick screen location
  38. //设置框架 宽度,高度,病并让平台拾取屏幕位置
  39. setSize(screenWidth / , screenHeight / );
  40. setLocationByPlatform(true);
  41.  
  42. // set frame icon
  43.  
  44. Image img = new ImageIcon("icon.gif").getImage();
  45. setIconImage(img);
  46. }
  47. }

运行结果:

测试程序3:

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

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

掌握自定义组件的用法。

  1. - 代码:
  2.  
  3. package notHelloWorld;
  4.  
  5. import javax.swing.*;
  6. import java.awt.*;
  7.  
  8. /**
  9. * @version 1.34 2018-04-10
  10. * @author Cay Horstmann
  11. */
  12. public class NotHelloWorld
  13. {
  14. public static void main(String[] args)
  15. {
  16. EventQueue.invokeLater(() ->
  17. {
  18. NotHelloWorldFrame frame = new NotHelloWorldFrame();
  19. frame.setTitle("NotHelloWorld");//将此窗体的标题设置为指定的字符串。
  20. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可控
  21. frame.setVisible(true);
  22. });
  23. }
  24. }
  25.  
  26. /**
  27. * A frame that contains a message panel.
  28. */
  29. class NotHelloWorldFrame extends JFrame
  30. {
  31. public NotHelloWorldFrame()
  32. {
  33. add(new NotHelloWorldComponent());
  34. pack();
  35. }
  36. }
  37.  
  38. /**
  39. * A component that displays a message.//显示消息的组件
  40. */
  41. class NotHelloWorldComponent extends JComponent
  42. {
  43. public static final int MESSAGE_X = ;
  44. public static final int MESSAGE_Y = ;
  45.  
  46. private static final int DEFAULT_WIDTH = ;
  47. private static final int DEFAULT_HEIGHT = ;
  48.  
  49. public void paintComponent(Graphics g)
  50. {
  51. g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
  52. }
  53.  
  54. public Dimension getPreferredSize()
  55. {
  56. return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  57. }
  58. }

运行结果:

第三部分:实验总结

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

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

201871010101-陈来弟《面向对象程序设计(Java)》第十二周学习总结的更多相关文章

  1. 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试

    20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...

  2. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  3. 201521123061 《Java程序设计》第十二周学习总结

    201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...

  4. 201521123072《java程序设计》第十二周学习总结

    201521123072<java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象 ...

  5. 201521123038 《Java程序设计》 第十二周学习总结

    201521123038 <Java程序设计> 第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student ...

  6. 201521123122 《java程序设计》第十二周学习总结

    ## 201521123122 <java程序设计>第十二周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将St ...

  7. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  8. 201771010134杨其菊《面向对象程序设计java》第八周学习总结

    第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...

  9. 201771010134杨其菊《面向对象程序设计java》第七周学习总结

    第七周学习总结 第一部分:理论知识 1.继承是面向对象程序设计(Object Oriented Programming-OOP)中软件重用的关键技术.继承机制使用已经定义的类作为基础建立新的类定义,新 ...

  10. 201521123005 《Java程序设计》 第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

随机推荐

  1. shiro异步请求返回JSON响应

    shiro异步请求返回JSON响应 需求1:当shiro请求资源,但是没有进行认证时,默认是进行重定向,现在需要返回JSON响应.注意异步请求,服务器重定向后,ajax拿到的是浏览器重定向后的到的页面 ...

  2. table的常用属性

    Table属性: Cellspacing:单元格与单元格之间或者单元格与表格之间的 距离. Cellpadding:单元格边框与内容之间的距离 Colspan:跨列.合并列. Rowspan:跨行,行 ...

  3. aliyun-oss 通过redis来实现跨域上传图片到阿里 OSS并回显进度条

    public class PutObjectProgressListener implements ProgressListener {        private long bytesWritte ...

  4. sublime3配置

    1.sunblim3配置 一旦配置好了,如果换了一台电脑那直接将C:\Users\djx\AppData\Roaming\Sublime Text 3\Packages\User文件夹拷贝到新下载的s ...

  5. 在线程内关闭thread handle,导致server crash

    很多年以前了,那时tester发现一个server crash,通过测试pager功能很多次,可以把server搞崩溃. 一般来说,能再现的bug都不难改,不过这次因为要跑很多次test,才能再现cr ...

  6. 用scratch写了一个win98 界面模拟

    scratch模拟win98 玩耍,放在网上了https://kada.163.com/project/4216461-3515165.htm

  7. vue_05项目配置

    目录 vue项目配置: 前端样式结构: settings配置: vue项目路由配置: vue全局js配置: vue全局css配置: 父传子: 父组件 子组件 二.子传父 子组件 父组件 vue项目配置 ...

  8. lanyu 激活idea

    编辑 C:\Windows\System32\drivers\etc\hosts 文件,最后面加入下面两行 0.0.0.0 account.jetbrains.com 0.0.0.0 www.jetb ...

  9. 公式推导【IoUNet//ECCV2018】

    Jiang B, Luo R, Mao J, Xiao T, Jiang Y. Acquisition of localization confidence for accurate object d ...

  10. 详解 IaaS、PaaS和SaaS 以及他们各自的代表公司

    ——IaaS,PaaS和SaaS 是云计算领域的专业术语,也是云计算的三种服务模式.   (1)SaaS:Software as a Service,软件即服务(也称为云应用程序服务) . 云市场中企 ...