⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java(day11).txt

📁 Java学习笔记
💻 TXT
字号:
                         CoreJava第十一天      2007年5月11日
一、复习
集合:用一个对象储存管理多个对象

Collection:元素都是对象
遍历:迭代遍历

List:元素有顺序,可以重复
      遍历:还可以用for循环(下标)
      排序:Collections.sort(list)
实现类:
ArrayList:底层数组实现,查询快,而增删慢;轻量级,线程不安全
Vector:底层数组实现,重量级,线程安全
LinkedList:底层链表实现,查询慢,增删快
在Java中用LinkedList实现一个栈,不用数组,因为栈的主要功能就是增删,数组慢;不用Vector,因为效率低

Set:元素无序,元素内容不重复
SortedSet:按照各种排序规则给Set排序

实现类:
HashSet:采用哈希算法保证元素不重复,覆盖hashCode()保证哈希码相同,equals()保证true
TreeSet:元素一定要实现了Comparable接口的
         根据排序规则,compareTo()返回0,说明是重复元素

Map:元素是键值对
     key  无序,不重复       value 可以重复
SortedMap:按照key排序
遍历:values() 遍历所有的值对象
      keySet() 遍历所有的键对象
实现类:
HashMap:线程不安全 , 允许null作为key和value
Hashtable:线程安全,不允许
TreeSet:SortedSet的实现类

二、java中的图形界面

GUI,图形化的用户接口,为了人机交互使用的。

BS与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。
在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S 与 B/S 区别: 
1.硬件环境不同: 
  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行 
2.对安全要求不同 
  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.
  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
3.对程序架构不同 
  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 
     全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟. 
4.软件重用不同 
  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子 
5.系统维护不同? 
  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级. 
6.处理问题不同 
  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小. 
7.用户接口不同 
  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本. 
8.信息流不同 
  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

构造图形界面的步骤
1,选择一个容器
2,设置容器的布局管理器
3,向容器添加组件
4,事件的监听

容器(Container)用于管理其他的组件的对象。组件必须放到容器里。
JFrame,这是一个最顶层的窗体容器,所有其他的组件必须放在顶层容器里。
   JFrame frame = new JFrame("Hello Swing");  //创建窗体,字符串为窗体的标题
   frame.setSize(500,300);  //设置窗口大小,500像素长,300像素高
   frame.setVisible(true);  //设置可见性
JPanel,他不是顶层容器,必须放在顶层容器中,任何一个容器都有add()方法,Panel面板是透明的(默认)。他也是一个组件。
JDialog 对话框容器,他要依附于其父组件,他不是一个顶层容器。


布局管理:对于任何一个容器类中都有setLayout()方法,用容器对象调用这个方法,来设置容器的布局管理器(LayoutManager这是一个接口,所有布局管理器都实现了这个接口)。

可用的布局管理器:
所有的布局管理器实现了一个接口java.awt.LayoutManager
FlowLayout,流式布局管。尝试在一行中按增加顺序摆放组件,窗体大小改变时,组件位置会相应发生改变
    Panel的默认布局管理就是FlowLayout。
    FlowLayout flow = new FlowLayout();
     frame.setLayout(flow);
BorderLayout,按方位进行布局管理,(North,South,East,West,Middle)不明确指定,就会默认加载在中间(Middle),每个部分只能放一个组件
    frame.add(Component comp,String place);这个方法是在指定的位置添加组件。
    JFrame的默认布局管理器
GridLayout,网格布局,通过行列,间距,来用网格分割,把组件放入如网格中,先行后列摆放组件。可以保证每个组件的大小都是一样的
    frame.setLayout(new GirdLayout(3,2));  //把容器平均的分为3行2列,先左后右,先上到下的顺序排列
CardLayout,卡片布局,组件重叠放置。
GridBagLayout,组件可以跨行跨列的网格布局。

*** 注意:一定要在图形界面都其他功能都设置好之后才能设置可见性。

JButton :按钮
JTextField:单行文本域
JTextArea:多行文本区
JPasswordField:密码输入框
JScrollPane:滚动窗体  使用一个多行文本域作为参数创建滚动窗体
JComboBox:下拉选择框

JRadioButton:单选按钮
JCheckBox:多选按钮
JList:多行列表
JLabel:标签
JEditorPane:显示结构化文档
Border:边框

JMenuBar:菜单条
JMenu:菜单
JMenuItem:菜单项
JPopupMenu:弹出式菜单

JSlider:滑动条
JProgressBar:进度条
JTabbedPane:分层面板
JSplitPane:分隔面板
JToolBar:工具条

JFileChooser:文件选择器
JColorChooser:颜色选择器

显示对话框 
JoptionPane 里面有很多静态方法可以弹出对话框

注意:具体的方法可以去参看Java2 SE的API文档。


三、awt事件模型(观察者模式)(重点)

事件模型中,包括事件源对象,事件处理者(事件监听者对象),事件对象。

事件源和事件处理者之间建立了授权注册关系,也就是在事件源类中有一个事件处理者的对象作为属性,也可能是一个事件处理者的集合。
       
          事件对象
事件源————————〉事件处理者

这就是事件模型的机制,也就是由事件源对象发送一个消息(事件对象),然后事件处理者调用相应的方法处理事件。

在事件监听器接口中定义的方法,都要以事件对象为参数。

***   一个事件源可以注册多个同类型的监听器,也可以注册多种多个事件监听器,
      一个事件监听器也可以为多个事件源服务。

事件对象继承自EventObject类,并可以通过getSource()方法获得事件源对象,当然需要在构造事件对象时将事件源对象传入,来区分是哪个事件源发出的事件,所以要用事件对象作为参数。

事件源,事件对象,监听接口,在java.awt包中提供了很多已经定义好的,只需要实现监听接口就好了。

什么是发消息:
A,B,C三个类,分别作为事件源,事件处理者,事件对象。
在A类中有一个B类的属性或者是一个内容为B类对象的集合,也就是事件源和事件处理者之间的建立了授权关系,
在B类需要实现一个自定义的接口,这个自定义的接口继承了EventListener,EventListener接口中没有定义任何方法,这只是一个标记接口。
实现在自定义接口中定义好的用于事件处理的方法,C类要继承EventObject类。
这些方法是以事件对象为参数的b(C c),而后在A类a(C c)方法中使用B类的对象调用B类中的b(C c)方法,
并把事件对象作为参数,并在main方法中用A类的对象调用了a(c)方法,这也就叫做A类对象给B类发送了消息。

也就是说事件源对象间接调用了事件监听器的方法,并以事件对象为实参传到事件监听器的方法中,要就叫事件源给事件监听器的方法发了一个消息(事件对象)。


例子如下:
import java.util.*;
//事件源类
class A{
	private String test;
	private List li=new ArrayList();
	public A(String test){
		this.test=test;
	}
	public String getTest(){return this.test;}
	public void addB(B b){
		this.li.add(b);
	}
	public void removeB(B b){
		this.li.remove(b);
	}
       /*
       * 所谓的事件源给事件监听器,发送事件对象。
       * 其实就是事件源用事件为参数,调用时间监听器的相应方法
       */
	public void fire(){
		C c=new C(this);
		Iterator it=li.iterator();
		while(it.hasNext()){
			B b=(B)it.next();
			b.b(c);     
		}
	} 	
}
//事件监听器的接口,要继承EventListener标记接口
//监听接口中的每一个方法,都应该以对应的时间对象作为参数
interface Blistener extends EventListener{
	void b(C c);
}
//事件监听器,实现接口
class B implements Blistener{
	public void b(C c){
		A a=(A)c.getSource();
		System.out.println(a.getTest()+" "+c.getMessage());
	}
}
/*
* 事件对象类
* 事件对象类中要封装事件源对象
*/
class C extends EventObject{
	private String message;
	public C(Object src){
		super(src);
	}
	public void setMessage(String message){
		this.message=message;
	} 
	public String getMessage(){return this.message;}	
}
public class Test{
	public static void main(String[] args){
		A a1=new A("Event");
		B b1=new B();
		c1.setMessage("Test");
		a1.addB(b1);//注册监听器
		a1.fire();//发送事件
	}
}
以上代码只是事例,在引入包之后可以运行。

在Java的图形编程中,所有动作(事件)都已经提供了相应的事件对象和事件监听接口,例如:实现窗口的关闭按钮,点击关闭按钮会发出相应的事件对象,相应的调用监听器中实现好的方法。
相应的方法清参阅Java2 SE API帮助文档。

缺省适配模式,通过一个抽象类实现接口,抽象类中的接口方法实现,都是一个无意义的空实现,可以继承这个抽象类,只覆盖向覆盖的方法就可以了。

在java.awt.event包中,会有一些适配类,也就是把相应的XXXListener,换成XXXAdapter就是适配类。
在java.awt.event包中的ActionEvent类,在以下操作中会发送这个事件,
1,JButton组件,按钮被点击
2,JTextField组件,在单行文本域中按Enter键。
3,JCheckBox组件,选中了复选框。
4,JRadioButton组件,选中了单选按钮。
5,JMenu组件,选中菜单项。


作业:
写一个股市类作为事件源,事件源会随机产生波动,写两个监听类,一个会在股市跌的时候卖出,涨的时候买入,另一个投资逻辑刚好相反

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -