201871020225-牟星源《面向对象程序设计(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.Java的集合框架:实现了对各种数据结构的封装
(1)框架:就是一个类库,框架中包含一些通用接口和超类,编程者实现这些接口或创建这些超类的子类就可方便的设计程序所需要的类
(2)集合(容器)是一类包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以有不同类型的对象组成
(3)Java的集合类包含在Java.util包中
注:集合类只容纳对象,数组可以容纳基本数据类型和对象。
2. Vector类
(1)类似长度可变的数组
(2)只能存放对象
(3)其元素通过下标进行访问
(4)关键方法:
——void addElement(Object obj)
——void add(int index,Object element)
——Object elementAt(int index)
——void insertElementAt(Object obj,int index)
3. Stack类
(1)描述堆栈数据结构,即FILO
(2)关键方法: ——public void push(Object item) //把项压入栈顶
——public Object pop() //出栈
——public boolean empty() //测试堆栈是否为空
——public Object peek() //查看栈顶对象而不移除它
4. Hashtable 类
(1)Hashtable通过键来查找元素
(2)用散列码来确定键,所有对象都有一个散列码,可以通过Object类的hashCode()方法获得
5. 集合框架中的基本接口
(1)Collection : 集合层次中的根接口。
(2)Set: 不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set.
HashSet:底层的数据结构是哈希表(散列表)。无序,比数组查询效率高,线程不同步。
TreeSet:底层数据结构是二叉树。可以对Set集合的元素按照指定规则进行排序。线程不同步。
(3)List: 是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式----ArrayList(按顺序存储)和 linklist(按链式存储)
ArrayList类可以将其看作是能够自动增长容量的数组,利用ArrayList的toArray()返回一个数组
LinkedList类是采用双向循环链表实现的;利用LinkedList实现栈,队列,双向队列,类内除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素;
(4)Map: 包含了Key-value对,不能包含重复的key。元素是成对出现的,以键和值的形式体现出来,键要保证唯一性。
(5) SortedMap是一个按照升序排列key的Map.
第十章 图形程序设计
10.1 Swing概述
Swing新一代的图形界面工具。使用 Swing 来开发图形界面比 AWT 更加优秀,因为 Swing 是一种轻量级组件,它采用纯 Java 实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色。除此之外,Swing 提供了比 AWT 更多的图形界面组件,因此可以开发出美观的图形界面程序。
10.2 创建框架
(1)创建空框架:
在Java中,常采用框架创建初始界面,即GUI的顶层窗口;
AWT库中有一个基于对等体的Frame类;
该类的Swing版本为JFrame,JFrame是Frame的子类;
(2)框架定位于框架属性:
定位:——常用Component类的setLocation和setBounds方法
常用属性:——Title:框架标题;——IconImage:框架图标;
(3)确定框架大小:
通过调用Toolkit类的方法来得到屏幕尺寸信息;
10.3 在组件中显示信息
1.在JFrame中有四层面板。其中的根面板、层级面板和玻璃面板人们并不太关心;它们是用来组织菜单栏和内容窗格以及实现观感的。Swing程序员最关心的是内容窗格(content pane)。在设计框架的时候,将所有的组件添加到内容窗格中。
2.绘制一个组件,需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法。paintComponent方法有一个Graphics类型的参数,这个参数保存着用于绘制图像和文本的设置。在Java中,所有的绘制都必须使用Graphics对象,其中包含了绘制图案、图像和文本的方法。
3.无论何种原因,只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法。
4.一定不要自己调用paintComponent方法。在应用程序需要重新绘图的时候,这个方法将被在佛那个地调用,不要人为的干预这个自动的处理过程。
5.如果需要强制刷新屏幕,就需要调用repaint方法,而不是paintComponent方法。它将引发采用相应配置的Graphics对象调用所有组件的paintComponent方法。
6.在框架中添加一个或多个组件时,如果只想使用它们的首选大小,可以调用pack方法而不是setSize方法。
7.有些程序员更喜欢扩展JPanel,而不是JComponent。JPanel是一个可以包含其他组件的容器(container),但同样也可以在其上面进行绘制。有一点不同之处是,面板不透明,这意味着需要在面板的边界内绘制所有的像素。最容易实现的方法是,在每个面板子类的paintComponent方法中调用super.paintComponent来用背景色绘制面板。
8.javax.swing.JFrame 1.2
(1)Container getContentPane() 返回这个JFrame的内容窗格对象。
(2)Component add(Component c)将一个给定的组件添加到改框架的内容窗格中(在Java SE 5.0以前的版本中,这个方法将抛出一个异常)。
9.java.awt.Component 1.0
(1)void repaint()“尽可能快地”重新绘制组件。
(2)Dimension getPreferredSize()要覆盖这个方法,发挥这个组件的首选大小。
10.javax.swing.JComponent 1.2
void paintComponent(Grphics g)覆盖这个方法来描述应该如何绘制自己的组件。
11.java.awt.Window 1.0
void pack()调整窗口大小,要考虑到其组件的首选大小
10.4 处理2D图形
Graphics类包含绘制直线,矩形或者椭圆的方法。但是绘制图形的能力有限,不能改变线的粗细,不能旋转这些图形
Java se 引入了Java 2D库,这个库实现了功能强大的图形操作。
要想使用Java 2D库绘制图形,需要获得一个Graphics2D类对象。这个类是Graphics的子类。自从JavaSE 2版本以来,paintComponent方法就会自动的获得一个Graphics2D类对象,我们只需要进行一次类型转换就可以了。
public void paintComponent(Graphics g )
{
Graphics2D g2=(Graphics2D ) g;
}
java 2D库采用面向对象的方式将几何图形组织起来,包含直线、矩形椭圆类:
Line2D
Rectangle2D
Ellipse2D
Java 2D 支持更加复杂的图形,如圆弧,二次曲线,三次曲线和通用路径。
要想绘制图形,首先要创建一个实现了Shape接口的类的对象。然后调用Graphics2D类中的draw方法。
10.6 使用颜色
Graphics 2D类的setPaint方法(Graphics类为setColor方法)用来设置颜色;
1、Color类中定义的13种标准颜色:
BLACK、BLUE、CYAN、DARK_GRAY、GRAY、GREEN、LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、WHITE、YELLOW
2、复合色:
通过指定红绿蓝三色比例,用color类对象来复合成一种新的颜色;
Color的构造器:
Color(int redness,int greenness,int blueness)
3、图形颜色常用的API:
void Color(int r,int g,int b)
void setColor(color c)
void getColor();
void setPaint(Paint p);
void fill(Shape s);
void setBackground(Color c)
void setForeground(Color c)
10.7 文本使用特殊字体
1、AWT的五种逻辑字体名:
SanaSerif Serif Monospaced Dialog Dialoginput。
这些逻辑字体在不同语言和操作系统上映射为不同的物理字体;
2、字体风格:
Font.PLAIN Font.BOLD Font.ITALIC Font.BOLD+Font.ITALIC
10.8 显示图像
可以使用Graphics类的drawImage方法将图像显示出来:
注意:这个调用可能会在图像还没有绘制完毕就返回。
boolean drawImage(Image img, int x, int y, ImageObserver observer);
绘制一幅非比例图像。
boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer);
绘制一幅比例图像。系统按照比例将图像放入给定宽和高的区域。
xy是图像左上角的坐标,observer是绘制进程中以通告为目的的对象(可能为null) v。
第二部分:实验部分
实验1: 导入第9章示例程序,测试程序并进行代码注释。
实验1:测试程序1
l 使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
l 掌握Vetor、Stack、Hashtable三个类的用途及常用API。
示例程序一代码如下:
1 import java.util.Vector;
2 class Cat {
3 private int catNumber;
4 Cat(int i) {
5 catNumber = i;
6 }
7 void print() {
8 System.out.println("Cat #" + catNumber);
9 }
10 }
11 public class Cats{
12 public static void main(String[] args){
13 Vector<Cat> cats= new Vector<Cat>();
14 for(int i=0; i<7; i++)
15 cats.addElement(new Cat(i));
16 for(int i=0; i<cats.size(); i++)
17 (cats.elementAt(i)).print();
18 }
19 }
运行结果:
示例程序二代码如下:
import java.util.*;
public class Stacks
{
static String[] months={"金","银","铜","铁"}; //创建了一个名为months的字符串型数组
public static void main(String[] args){
Stack<String> stk = new Stack<String> (); //建立一个栈
for(int i=0; i<months.length; i++) //写了一个循环来进行入栈的操作,将months数组中的字符全部入栈
stk.push(months[i]); //进行入栈操作
System.out.println(stk); //将栈中的数据进行输出
System.out.println("element 2=" + stk.elementAt(2)); //输出栈中的第二个数据
while(!stk.empty()) //对栈进行判断,看是否为空,不为空执行以下操作
System.out.println(stk.pop()); //对栈中的数据进行弹栈操作
}
}
运行结果:
示例程序三代码如下:
package nine;
//示例程序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++) {
//通过Math.random()的随机性查看随机生成的10000个数在0-20 之间的分布
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:测试程序2
l 使用JDK命令编辑运行ArrayListDemo和LinkedListDemo两个程序,结合程序运行结果理解程序;
ArrayListDemo代码如下:
package nine;
import java.util.*;
public
class
ArrayListDemo {
public
static
void
main(String[] argv) {
ArrayList al =
new
ArrayList();
// Add lots of elements to the ArrayList... 向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. 使用for循环进行打印
System.
out
.println(
"Retrieving by index:"
);
for
(
int
i = 0; i < al.size(); i++) {
System.
out
.println(
"Element "
+ i +
" = "
+ al.
get
(i));
}
}
}
LinkedListDemo代码如下:
package nine;
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:测试程序3
l 在Elipse环境下编辑运行调试教材360页程序9-1,结合程序运行结果理解程序;
l 掌握ArrayList、LinkList两个类的用途及常用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)
{
var
a =
new
LinkedList<String>();
a.add(
"Amy"
);
a.add(
"Carl"
);
a.add(
"Erica"
);
var
b =
new
LinkedList<String>();
b.add(
"Bob"
);
b.add(
"Doug"
);
b.add(
"Frances"
);
b.add(
"Gloria"
);
//在a和b中添加元素
// merge the words from b into a 将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);
// remove every second word from b 删除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中删除b中的所有单词
a.removeAll(b);
System.
out
.println(a);
}
}
运行结果如下:
实验2:导入第10章示例程序,测试程序并进行代码注释。
实验2:测试程序1
l 运行下列程序,观察程序运行结果。
l 在elipse IDE中调试运行教材407页程序10-1,结合程序运行结果理解程序;与上面程序对比,思考异同;
l 掌握空框架创建方法;
l 了解主线程与事件分派线程概念;
l 掌握GUI顶层窗口创建技术。
示例代码如下:
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
);
//显示框架
}
}
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(() ->
//事件分配线程中
{
var
frame =
new
SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//定义一个用户关闭框架时的响应动作
frame.setVisible(
true
);
//为了显示框架,main方法需要调用框架的setVisible方法
});
}
}
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:测试程序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(() ->
{
var
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);
}
}
运行结果如下:
实验2:测试程序3
l 在elipse IDE中调试运行教材418页程序10-3,结合运行结果理解程序;
l 掌握在框架中添加组件;
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(() ->
{
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;
//字符串中的第一个字符位于从左至右75像素
public
static
final
int
MESSAGE_Y = 100;
//第一个字符位于从上到下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);
}
//调用Graphics类中的drawString方法显示文本
public
Dimension getPreferredSize()
//覆盖getPreferredSize方法,返回一个有首选宽度和高度的Dimension类对象
{
return
new
Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
运行结果如下:
第三部分:实验总结:
在本周中我了解了第九章和第十章的内容。在第九章集合中学到了集合类,主要有Vector类,Stack类和Hashtable类。Vector类类似于数组,但其长度是可变的。Stack类描述了堆栈的数据结构,即FILO。Hashtable类通过键来查找元素,用散列码来确定键。集合中的基本接口中,collection是层次中的根接口,Set不能包含重复的元素,而list 是一个有序集合,主要有两个类的实现,ArrayList 和 LinkList类。String类是新一代的图形界面工具,位于javax.swing包中。顶层窗口称为框架。由component类的子类或间接子类的对象称为一个组件,还有容器的概念。框架属性和框架定位的一些基本方法。因为都是一些验证性的实验,再加上看书,所以就理解的还可以。但在实验部分还有所欠缺,会通过网课继续学习。