Java编程思想第14章-22章

第14章类型信息

运行时类型信息使得你能够再程序时发现和使用类型信息
为何须要RTTI
使用RTTI能够查询某个shape引用所指向的对象的确切类型,选择或者删除结构。
Class对象
类型信息在运行时是由称为class对象的特殊对象完成的,它包含了与类有关的信息。Class对象就是用来建立类的全部的“常规”对象的,Java使用class对象来执行其RTTI。java

类字面常量
Java还提供了另外一种方法来生成对class对象的引用,即便用类字面常量。
为了使用类而作的准备工做实际包含三个步骤:加载,连接,初始化。程序员

新的转型语法
Java SE5还添加了用于class引用的转型语法,即cast()方法
Cast()方法接收参数对象,并将其转型为class引用的类型web

类型转换前先作检查
迄今为止,咱们已知RTTI形式包括:编程

  1. 传统的类型转换,如“shape”, 由RTTI确保类型转换的正确性,若是执行一个错误的类型转换,就会抛出一个ClassCastException异常
  2. 表明对象的类型的class对象,经过查询class对象能够获取运行时所需的信息

动态的instanced
Class.isinstanced 方法提供了一种动态的测试对象的途径,因而全部那些单调的instanceof语句均可以从PetCount.java的例子中移除了。canvas

注册工厂
使用工厂方法设计模式吗,将对象的建立工做交给类本身去完成。工厂方法能够被多态的调用,从而为你建立恰当类型的对象。设计模式

反射,运行时的类型信息
若是不知道某个对象的确切类型,RTTI能够告诉你。可是有一个限制,在编译时,编译器必须知道全部要经过RTTI来处理的类。数组

类方法提取器
反射在Java中时用来支持其余特性的,例如对象序列化和JavaBean,可是,若是能动态的提取某个类的信息有时仍是有用的。请考虑方法提取器。浏览实现了类定义的源代码或是其jdk文档,只能找到在这个类定义中被定义或被覆盖的方法。浏览器

动态代理
代理是基本的设计模式之一,它是你为了提供额外的或不一样的操做,而插入的用来代替“实际”对象的对象,这些操做一般涉及与“实际”对象的通讯,所以,代理一般充当着中间人的角色。
Java的动态代理比代理的思想更向前迈进了一步,由于它能够动态地建立代理并动态的处理对所代理的方法的调用。
Invoke()方法中传递进来了代理对象,以防你须要区分请求的来源,在invoke()内部,在代理上调用方法时需格外当心。安全

空对象
引入空对象的思想能够接受传递给它的所表明的对象的信息,可是,将返回表示为实际上并不存在任何“真实”对象的值。经过这种方式,能够假设全部对象都是有效的。
空对象的逻辑变体时模拟对象和桩。与空对象同样,它们都表示在最终的程序中所使用的“实际”对象。可是,模拟对象和桩都只是假扮能够传递实际信息的存活对象,而不是像空对象那样能够成为null的一种更加智能化的替代物。服务器

接口与类型
Interface关键字的一种重要目标就是容许程序员隔离构件,进而下降耦合性。若是你编写接口,那么就能够实现这一目标,可是经过类型信息,这种耦合性仍是会传播出去。

第15章 泛型

在面向对象编程语言中,多态算是一种泛化机制。泛型实现了参数化类型的概念,使代码能够应用于多一种类型。“泛型”这个术语的意思是:“适用于许多许多的类型”。
一个元组类库
(元组)就是一组对象直接打包存储于其中的一个单一对象。这个容器对象容许读取其中元素,可是不容许向其中存放新的对象。
不管什么时候,只要您能作到,就能够尽可能使用泛型方法。若是static方法须要使用泛型能力,就必须使其成为泛型方法。要定义泛型方法,只需将泛型参数列表置于返回值以前。
当使用泛型类时,必须在建立对象的时候指定类型参数的值,而使用泛型方法的时候,一般没必要指明参数类型,由于编译器会为咱们找出具体的类型。这成为类型参数推断。

第16章 数组

数组为何特殊?
数组是一种效率最高的存储和随机访问对象序列的方式。数组就是一个简单的线性序列,这使得元素范文很是迅速。可是数组对象的大小被固定,而且在其生命周期中不可改变。Arraylist的效率比数组低不少。
数组和容器均可以保证你不能滥用它们。不管你是使用数组仍是容器。若是越界,都会获得一个表示程序员错误RuntimeEception异常。
数组能够持有基本类型,而泛型以前的容器则不能。可是有了泛型,容器就能够指定并检查它们所持对象的类型,而且有了新的包装机制,容器看起来还能持有基本类型。

数组是第一级对象
对象数组保存的是引用,基本类型数组直接保存基本类型的值。
数组中构成矩阵的每一个向量均可以具备任意的长度(这被称为粗糙数组)
使用参数化方法而不使用参数化类的方便之处在于:你没必要为须要应用的每种不一样的类型都使用一个参数去实例化这个类。

建立测试数据
Java标准类库Arrays有一个做用十分有限的fill()方法,只能用一个值填充各个位置,而针对对象而言,就是复制同一个引用进行填充。

数据生成器
若是某个工具使用了Generator,那么你能够经过选择Generator的类型来建立任何类型的数据。

从Generator中建立数组
第一个工具使用任意的Generator来产生object子类型的数组。为了处理基本类型,第二个工具接收任意基本类型的包装器类型数组,并产生相应的基本类型数组。

Arrays实用功能
Arrays类的6个基本方法
1) equals()比较两个数组是否相等
2) deepEquals()用于多维数组
3) binarySearch()用于在已经排序的数组中查找元素
4) toString()产生数组的string表示
5) hashcode()产生数组的散列码
6) Arr ays.aslist()接受任意的序列或数组做为其参数,将其转变为list容器

复制数组:System.arraycopy(),针对全部类型作了重载,它不会执行自动包装和自动拆包,两个数组必须具备相同的确切类型。

Generator()方法生成一个对象,此对象经过建立一个匿名内部类来实现Generator接口
Collection类包含一个reverseorder()方法,该方法能够产生一个comparater,它能够反转天然的排序,这很容易应用于comptype。

第17章 容器深刻研究

Collection的功能方法
下面列出了能够经过collection执行的全部操做(不包括从object继承而来的方法),所以它们也是能够经过set或list执行的全部操做(list还有额外的功能)。Map不是继承自collection的。

Boolean add(T) 确保容器持有具备泛型类型T的参数
Boolean addall(collection <?extends T>) 添加参数中的全部元素
Void clear() 移除容器中的元素
Boolean contains (T) 若是容器已经持有具备泛型类型T 此参数,则返回true
Boolean containsall(collection <?>)若是容器持有此参数中的全部元素,则返回true
Boolean isEmpty 容器中没有元素时返回true
Iterator isterator() 返回一个Iterator,能够用来遍历容器中的全部元素
Int size() 返回容器中元素的数目
Object[ ] to Array() 返回一个数组,该数组包含容器中的全部元素
若是想检查collection中的元素,那就必须使用迭代器。
可选操做:执行各类不一样的添加和移除的方法在collection接口中都是可选的操做。这意味着实现类并不须要为这些方法提供功能定义。
未或支持的操做:最多见的未或支持的操做都来源与背后由固定尺寸的数据结构支持过的容器
Sortedset中的元素能够保证处于排序状态,这使得它能够在sortedSet接口中的下列方法提供附加的功能:compartor compartor()返回当前set使用的comparator;或者返回null,表示以天然方式排序
Object first()返回容器中的第一个元素
Object last() 返回容器中的最末一个元素
SortedSet: 按对象的比较函数对元素排序

队列:除了并发应用,Queue在Java SE5中仅有的两个实现时linkedlist和priorityQueue,它们的差别在于排序行为而不是性能。
1)优先级队列
经过实现comparable而进行控制的
2)双向队列
能够在任何一端添加或移除元素。

理解map
映射表(也称为关联数组)的基本思想是它维护的是键值(对)关联,所以可使用键来查找值

性能
Hashmap使用了特殊的值,称做散列码,来取代对键的缓慢搜索。散列码是“相对惟一的”,用以表明对象的int值,它是经过将该对象的某些信息进行转换而生成的。Hashcode()是根类object中的方法,所以全部Java对象都能产生散列码。Hashmap就是使用对象的hashcode()进行快速查询的。
散列是映射中存储元素时最经常使用的方式,对Map中使用的键的要求与对set中的元素的要求同样,任何键都必须具备一个equals()方法,若是键被用于散列map,那么它必须具备恰当的hashcode()方法;用于treemap必须实现comparable。
使用散列的目的:想要使用一个对象来查找另外一个对象。散列的价值在于速度:散列使得查询得以快速进行。

第18章 Java I/O系统

一File类
既能表明一个特定文件的名称,又能表明一个目录下的一组文件的名称。
目录列表器
查看目录列表器有2种方法使用file对象。
1)调用不带参数的list()方法,得到此file对象包含的所有列表
2)得到一个受限列表,用到“目录过滤器”。这个类会告诉咱们怎样显示符合条件的file对象。
目录实用工具
经过使用local()方法产生由本地目录中的文件构成的file对象数组或者经过使用walk()方法产生给定目录下的由整个目录树中全部文件构成的list
二 输入输出
编程语言的I/o类库中常使用流这个抽象概念,它表明任何能力产出数据的数据源对象或者是有能力接收数据的接收端对象。
Inputstream类型用来表示那些从不一样数据产生输入的类。这些数据源包括:
1)字节数组
2)string对象
3)文件
4)“管道”,工做方式与实际管道类似,即从一端输入,从另外一端输出
5)一个由其余种类的流组成的序列,以便咱们能够将它们收集合并到一个流内
6)其余数据源
Outputstream类型,该类别的类决定了输出所要去往的目标:字节数组,文件或管道。
添加属性和有用的接口
Java I/O类库须要多种不一样功能的组合,这正是使用装饰器模式的理由所在。这也是Java I/o类库里存在filter(过滤器)类的缘由所在抽象类filter是全部装饰器类的父类
经过FilterinputStream从InputStream读取数据。
经过FilterOutputStream向OutputStream写入
三 Reader和Writer 提供兼容Unicode与面向字符I/O功能。另外:
1)Java1.1向inputstream和outputstream继承层次结构中添加了一些新类,因此显然这两个类是不会被取代的。
2) InputStreamReader能够把InputStream转换为Reader,而OutputStream writer能够把outputstream转换为writer

四 数据的来源和去处
几乎全部原始的Java I/o流类都有相应的Reader和Writer类来提供自然的Unicode操做。

五 更改流的行为
对于InputStream和OutputStream来讲,咱们会使用FilterInputStream和FilterOutputStream的装饰器子类来修饰“流”以知足特殊须要。

六 自我独立的类:RandomAccessFile
RandomAccessFile适用于由大小已知的记录组成的文件,全部可使用seek()将记录从一处转移到另外一处,而后读取或者修改记录。

七 缓冲输入文件
若是想要打开一个文件用于字符输入,可使用string或file对象做为文件名的fileinputreader,为提升速度,对那个文件进行缓冲,那么将所产生的引用传给一个BufferedReader构造器。
JDK1.4引入了文件加锁机制,它容许咱们同步访问某个做为共享资源的文件,Java的文件加锁直接映射到了本地操做系统的加锁工具。

八 压缩
Java I/O类库中的类支持读写压缩格式的数据流,能够用它们对其余的I/O类进行封装个,以提供压缩功能。1)用GZIP进行简单压缩 2)用ZIP进行多文件保存

九 XML
对象序列化的一个重要限制是它只是Java的解决方案,只有Java程序才能反序列化这种对象。一种更具互操做性的解决方案是将数据转换成xml格式,这可使其被各类各样的平台和语言使用。
Preferences API与对象序列化相比,前者与对象持久性更密切,由于它能够自动化存储和读取信息。不过,它只能用于小的,受限制的数据集合——咱们只能存储基本类型和字符串,而且每一个字符串的存储长度不能超过8K.
Preferences API用于存储和读取用户的偏好以及程序配置项的设置。Preferences 是一个键值集合(相似映射),存储在一个书点层次结构中。尽管节点层次结构可用来建立更为复杂的结构,但一般是建立以你的类名命名的单一节点。而后将信息存储于其中。

第19章 枚举类型

关键字enum能够将一组具名的值的有限集合建立为一种的类型,而这些具名的值能够做为常规的程序组件使用,这是一种很是有用的功能。

1.基本enum特性
调用enum的values()方法,能够遍历enum实例。Values()方法返回enum实例的数组,并且该数组中的元素严格保持其在enum中声明时的顺序,所以能够在循环中使用values()返回的数组
2.向enum中添加新方法
能够向enum中添加方法enum甚至能够有main()方法
3.switch语句中的enum
能够在switch语句中使用enum,在case语句中没必要使用enum类型修饰一个enum实例
4.values()的神秘之处
Values ()是由编译器添加的static方法
5.实现而非继承
全部enum都继承自Java.long.Enum类。因为Java不支持多重继承,全部你的enum不能再继承其余类,然而,在建立一个新的enum时,能够同时实现一个或多个接口,不过,必需要有一个enum实例才能调用其上方法。
6.随机选取
虽然enum只是一个至关短小的类,但在枚举类型中,它能消除不少重复的代码,重复总会制造麻烦,所以消除重复是有益处的。
7.使用接口组织枚举
在一个接口的内部,建立实现该接口的枚举,以此将元素进行分组,能够达到将枚举元素分类组织的目的,当须要与一大堆类型打交道时,接口就不如enum好用了。
8.使用EnumSet替代标志
Set是一种集合,只能向其中添加不重复的对象,enum也要求其成员都是惟一的,使用EnumSet优势是它在说明一个二进制位是否存在时,具备更好的表达能力,而且无需担忧性能。EnumSet中的元素必须来自一个enum。
9.使用EnumMap
EnumMap在内部可由数组实现,容许程序员改变值对象。
10.常量相关的方法
要实现常量相关的方法,须要为enum定义一个或多个abstract方法,而后为每一个enum实例实现该抽象方法
11.多路分发
1)使用enum并发 2)使用常量相关的方法 3)使用EnumMap分发 4)使用二维数组。

第20章 注解

注解(也被称为元数据)为咱们在代码中添加信息提供了一种形式化的方法,是咱们能够在稍后某个时刻很是方便地使用这些数据
1.基本语法
使用@Test进行注释,该注解自己并不作任何事情,可是编译器要确保在其构造器路径上必须有@ Test注解的定义
定义注解:@Target用来定义你的注解将应用于什么地方 @Rectetion用来定义该注解在哪个级别可用,在源代码中(SOURCE),类文件中(CLASS)或者运行时(Runtime),没有元素的注解称为标记注解,例如@Test。
元注解:@Target表示该注解可用于什么地方
@Retention 表示须要在什么级别保存该注解信息
@Documented 将此注解包含在Javadoc中
@Inherited容许子类继承父类中的注解
2.编写注解处理器
①注解元素:全部基本类型(int,float,boolean等)string,class,enum,Anotation以上类型的数组。注解也能够做为元素的类型,也就是说注解可用嵌套。
②默认值限制:元素必需要么具备默认值,要么在使用注解时提供元素的值。对于非基本类型的元素,不管在源代码中声名时,或是在注解接口中定义默认值时,都不能以null做为其值。
③生成外部文件
④注解不支持继承
⑤实现处理器
3.使用apt处理注解
注解处理工具apt,这是sun为了帮助注解的处理过程而提供的工具。因为这是该工具的初版,其功能还比较基础,不过它确实有助于程序员的开发工做。
4.将观察者模式用于apt
Mirror API提供了对访问者设计模式的支持。
5.基于注解的单元测试
单元测试是对类中的每一个方法提供一个或多个测试的一种实践,其目的是为了有规律地测试一个类的各个部分是否具有正确的行为。Java中最著名的单元测试工具是Junit。

第21章 并发

对于某些问题,若是可以并行地执行程序中的多个部分,则会变得很是方便甚至很是很是必要,由于这些部分要么看起来再并发地执行,要么在多处理器环境下能够同时执行并行编程可使程序执行速度获得极大提升,或者为设计某些类型的程序提供更易用的模型,或者二者兼有。
1.并发的多面性
必须理解全部问题和特例,以便有效地使用并发。
用并发解决的问题上大致能够分为“速度”和“设计可管理性”两种
①更快的执行 ②改进代码设计
2.基本的线程机制
使用线程机制是一种创建透明的,可拓展的程序方法,若是程序运行得太慢,为机器增添一个cpu就能很容易地加快速度的运行速度。多任务和多线程每每是使用多处理系统的最合理方式
1定义任务 2Thread类 3使用Executor 4从任务中产生返回值 5休眠
6优先级 7让步 8后台线程 9编码的变体 10术语 11加入一个线程
12建立有响应的用户界面 13线程组 14捕获异常
3.共享受限资源
原子性能够应用于初long和double以外的全部基本类型之上的简单操做。
经过使用同步控制块,可使多个任务访问对象的时间性能获得显著提升
4.终结任务
线程状态:一个线程能够处于如下四种状态之一
1)新建 2)就绪 3)阻塞 4)死亡
进入阻塞状态:一个任务进入阻塞状态,可能有以下缘由
1)经过调用sleep使任务进入休眠状态
2)经过调用wait()使线程挂起
3)任务在等待某个输入/输出完成
4)任务试图在某个对象上调用其同步控制方法,可是对象锁不可用,由于另外一个任务已经获取了这个锁。
5.线程之间的协做
当使用线程来同时运行多个任务时,能够经过使用锁(互斥)来同步两个任务的行为,使得一个任务不会干涉另外一个任务的资源。
Wait()与notifyAll()
Wait()使你能够等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。
6.死锁
一个任务之间相互等待的连续循环,没有哪一个线程能继续称为死锁,当如下四个条件同时知足时,就会发生死锁:
1)互斥条件,任务必须把资源释放当作普通事件
2)至少有一个任务他必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。要发生死锁,Philosopher必须拿着一根Chopstick而且等待另外一根
3)资源不能被任务抢占,任务必须把资源释放当作普通事件
4)必须有循环等待
要防止死锁的话只需破坏其中一个便可。
7.新类库中的构件
Java SE5的Java.util.concurrent引入了大量设计用来解决并发问题的新类。
1)CountDownLatch
被用来同步一个或多个任务,强制它们等待由其余任务执行的一组操做完成。
2)CyclicBarrier
使得全部的并行任务都将在栅栏处列队,所以能够一致的向前移动。
3)DelayQueue
这是一个无界的BlockingQuece,用于放置实现了Delayed接口的对象。其中的对象只能在其到期时才能从队列中取走。
4)PriorityBlockingQueue
很基础的优先级队列,它具备可阻塞的读取操做
5)使用ScheduledExecutor的温室控制器
每一个指望的温室事件都是一个在预约时间运行的任务
6)Semaphore
正常的锁(来自concurrent,locks或内键的Synchronized锁)在任什么时候刻都只容许一个任务访问一项资源,而计数信号量容许n个任务同时访问这个资源
7)Exchanger
Exchanger是在两个任务之间交换对象的栅栏。典型应用场景是:一个任务在建立对象,这些对象的生产单价很高昂,而另外一个任务在消费这些对象。经过这种元式能够有更多的对象在被建立的同时被消费。
8.仿真
并发最有趣的用法是建立仿真。经过使用并发,仿真的每一个构件均可以成为其自身的任务,使得仿真更容易编程。
9.性能调优
1)比较各种互斥技术 2)免锁容器 3)乐观加锁 4)keadWritelock对向数据结构相对不频繁写入,可是有多个任务要常常读取这个数据结构的这类状况进行优化。
10.活动对象
有一种可替换的方式被称为活动对象或行动者,有了活动对象,能够串行化信息而不是方法,意味着再也不须要防备一个任务在其循环的中间被中断这种问题了。
多线程的主要缺陷:1)等待共享资源的时候性能下降 2)须要处理现成的额外cpu消费 3)糟糕的程序设计致使没必要要的复杂度 4)有可能产生一些病态的行为,如饿死,竞争,死锁,活锁 5)不一样平台致使的不一致性。

第22章 图形化用户界面

设计中要遵循的一条基本原则是:“让简单的事情变得容易,让困难的事情变得可行”
1.applet
Applet是一种能够在Internet上传递,并在web浏览器中运行的程序。
2.Swing基础
大多数swing应用都被构建在基础的Jframe内部,jframe在你使用的任何操做系统中均可以建立视窗应用。
3.建立按钮
建立按钮:用你但愿出如今按钮上的标签调用Jbutton的构造器便可,通常来讲,要在类中为按钮建立一个字段,以便之后能够引用这个按钮。
Jbutton是一个组件,它有本身的小窗口,能做为整个更新过程的一部分而自动被重绘。
4.捕获事件
事件驱动编程的基础,就是把事件同处理事件的代码链接起来,一般把ActionListener实现成匿名内部类会更方便,尤为是对每一个监听器类只使用一个实例的时候更是如此。
5.文本区域
JTextArea有一个比较经常使用的方法就是append()。由于能够往回滚动,因此比起在命令行程序中把文本打印到标准输出的作法,这就成为了一种进步
6.控制布局
在Java中,组件放置在窗体上的方式可能与你使用过的任何GUI系统都不相同,首先,它彻底置于代码;没有用来控制组件布置的“资源”。第二,组件放置在窗体上的方式不是经过绝对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置,此外,布局管理器还能够适应applet或应用程序窗口的大小。
1)BorderLayout具备四个边框区域和一个中央区域的概念
2)FlowLayout直接将组件从左到右“流动”到窗体上,直到占满上方的空间,而后向下移动一行,继续流动。
3)GridLayout容许你构建一个放置组件的表格,在向表格里面添加组件的时候,它们将按照从左到右,从上到下的顺序加入。
4)GridBagLayout提供了强大的控制功能,包括精确判断视窗区域如何布局,以及视窗大小变化的时候如何从新放置组件。
5)绝对定位:使用Setlayout(null)方法把容器的布局管理器设置为空;为每一个组件调用setBounds或者reshape()方法(取决于语言的版本),为方法传递以像素坐标为单位的边界矩形的参数。根据你要达到的目的,能够在构造器或者point()方法中调用这些方法。
6)Boxlayout,使你能够在水平方向或者垂直方向控制组件的间隔。
7)最好的方式是什么:让合适的工具帮你作事情
7.Swing事件模型
在swing的事件模型中,组件能够发起(触发)一个事件。每种时间的类型由不一样的类表示。事件发生的地方能够与事件处理的地方分离开。
全部的事件处理逻辑都将被置于监听器类的内部
1)事件与监听器的类型
全部swing组件都具备add.xxxListener()和remove.xxxListener()方法。这样就能够为每一个组件添加或移除相应类型的监听器。每一个方法的“xxx”还表示方法所能接受的参数,好比addMyListener(MyListenerm).
2)跟踪多个事件
从Jbutton中继承本身的按钮对象
8.Swing组件一览
来自Java.sun.com的jdk文档包含了swing全部的类和方法
Swing中的事件使用了很好的命名习惯
当程序变得复杂的时候,应该过滤到使用GUI构造工具
1)按钮
Swing提供了许多类型的按钮,全部的按钮,包括复选框,单选按钮,甚至菜单项,都是从AbstratButton继承而来
2)图标
能够在JLable或者任何从AbstactButton(包含Jbutton,JCheckbox,Jradiobutton以及几种不一样Jmenuitem)继承的组件中使用ICON
3)工具提示
对于要放置在窗体上的组件,基本上所要作的就是(对于任何Jcomposnet派生类的对象)像这样编写:jc.settooliptext(“my tip”)
4)文本域
JTextField组件
5)边框
Jcomponent有一个SetBorder()方法,它容许为任何可视组件设置各类边框
6)一个迷你编辑器
JTextPane控件能够绝不费事的支持许多编辑操做
7)复选框
当JCheck Box被选中或清理选中时,将发生一个事件,能够用与对付按钮相同的方式捕获这个事件,使用ActionListener.
8)单选按钮
要设置一组关联的JReadioButton,你须要把他们加入到一个ButtonGroup中。能够选择将其中的一个按钮设置为选中(true)(在构造器中的第二个参数中设置)。若是你把多个单选按钮的状态都设置为选中,那么只有最后设置的那个有效
9)组合框
JcomboBox组合框与Windows操做系统下的组合框并不彻底相同,后者容许从列表中选择,后者本身输入。要想获得这样的行为,必须调用setEditable()方法。使用JcomboBox组合框,你能且只能从列表中选择一个元素。
10)列表框
JList组件容许多重选择;JList自己没有对滚动提供直接的支持。固然,你要作的只是把JList包装进JScrollpane,它将自动帮你处理其中的细节。
11)页签面板
JTabbedPane容许你建立“页签式的对话框”,这种对话框中沿着窗体的一边有相似文件夹的页签,当你在页签上点击时,就会向前进入到另外一个不一样的对话框中。
12)消息框
在Swing中,这些消息框包含在JoptionPane组件里,最经常使用的可能就是消息对话框和确认对话框,它们分别能够经过调用静态的JOptionPane.showMessageDialog()和JOptionPane.showConfirmDialog()方法获得。
13)菜单
在Java和Swing中,必须在源代码中构造全部菜单。
有关菜单的代码很快就变得冗长而凌乱,这时,使用GUI构造器工具才是明智的选择。好的工具还能够对菜单进行维护。
14)弹出式菜单
要实现一个JPopupMenu,最直接的方法就是建立一个继承自MouseAdapter的内部类,而后对每一个但愿具备弹出式行为的组件,都添加一个该内部类的对象。
15)绘图
若是使用好的GUI框架,绘图应该很是简单清楚,Swing库正是如此。
16)对话框
若是要编写一个对话框,就须要从JDialog继承,它只不过是另外一种类型的window与JFrame相似。JDialog具备一个布局管理器(默认BorderLayout),而且要添加事件监听器处理事件。
17)文件对话框
某些操做系统具备大量的特殊的内置对话框,它们能够处理诸如选择字体颜色,打印机等操做。基本上全部图形操做系统都支持打开和保存文件,因此Java提供了JFileChooser,它封装了这些操做,使文件操做变得更加方便。
18)Swing组件上的HTML
任何能接收文本的组件均可以接受HTML文件,且能根据HTML的规则来从新格式化文本。也就是说能够很容易地在Swing组件上加入漂亮的文本。
19)滑块与进度条
滑块能令用户经过先后移动滑点来输入数据,在某些状况下,这显得很直观。进度条能以从“空”到“满”的动态方式显示数据。

20)选择外观 “可插拔外观”使程序可以模仿不一样的操做系统的外观。 使9.JNLP与Java Web Start Java网络发布协议(Java Network launch Protocd, JNLP)能把applet的全部优势和应用程序的优势结合起来。 JNLP应用程序遵循与applet同样的沙盒安全限制 由于JNLP描述的是一个协议,而不是实现,因此要用JNLP,必需要有一个实现。Java Web Start(简称为JAWS),是由sun免费提供的官方参考实现,而且做为Java SE5的一部分而发布的。 10.Swing与并发 当你使用 Swing编程时,就是在使用线程。牢记事件分发线程,将有助于确保你的应用免遭死锁和竞争条件的影响。 1) 长期运行的任务 在使用图形化用户界面编程时最容易犯的错误之一,就是意外使用了事件分发线程来运行长任务。解决办法就是在单独线程中执行长期运行的任务。 2)可视化线程机制3)4)) 11.可视化编程与JavaBean 可视化表示一般就是组件在运行的过程当中可被观察到的方式。可视化编程工具极大地加速了程序的构建过程。 1) JavaBean是什么 经过引入JavaBean,Java把可视化组件的建立带到了最高的层次,由于Bean就是一个类。 2) 使用IntroSpector抽取出BeanInfo JavaBean模式的最关键部分之一,表如今当你从选用区拖动一个Bean,而后把它放置到窗体上的时候。 使用IntroSpector来显示Bean的信息是个值得学习的练习。 3) 一个跟复杂的Bean addActionListener()只支持单路的事件处理方式,即事件发生的时候它只能通知一个监听器。 4) JavaBean与同步 尽量让Bean中全部公共方法都是synchronized(同步)的。 当一个多路事件触发了一组对该事件感兴趣的监听器时,必须假定,在你遍历列表进行通知的同时,监听器可能会被添加或移除。 5) 把Bean打包 再把JavaBean加入到某个支持Bean的IDE以前,必须把它置于一个Bean容器中,Bean容器,也就是一个JAR文件,它里面包含了Bean的全部.class文件以及能代表“这是一个Bean”的“清单”文件。清单文件是一个文本文件,它遵循特定的格式。 6) 对Bean更高级的支持 属性能够被绑定,也能够被约束。 12.Swing更高级的支持 两种重要的可替代选择,即用于web之上的的客户端GUI的使用MacroMedia的flex编程系统的MacroMediaFlash,以及用于桌面应用的开源的Eclipse标准工具包(SWT)类库。 13.用flex构建flash web 客户端 大多数人均可以使用基于Flash的界面,而无需安装任何东西,而且它的外观和行为在全部系统和平台之上都是相同的。 经过使用MacroMediaFlash能够为Java应用开发Flash用户界面。 Flash Player使用向量来呈现图形,Flex效果可让你浅尝这些动画类型。效果是指能够经过使用MXML语法而应用到控件和容器上的转换。 Flex还为通用对话提供了效果,例如渐变,擦去和调整alpha通道,除了內键效果,flex还支持用于创新动画效果的flash绘制API。 Flex类库包含大量各类不一样的控件,它们具备大量的事件,覆盖了鼠标移动和键盘点击的全部方面。 Flex客户端将使用这个Java类中的getSongs()方法来为DataGrid获取数据,在flex中全部的服务调用,都是经过事件调用这些回调函数而异步返回的。 在最简单的数据绑定形式中,控件能够直接引用数据,flex基础设施会恰当地响应数据变化事件,而且更新全部绑定到该数据的控件。 必须使用flexlib标签指定flex-config.xml文件的位置,必须配置服务器使得flex应用程序能够成功地与Java文件对话。 14.建立SWT应用 SWT采用了中间路线,SWT编成模型更简单,SWT有不少控件,它们都简单易用。 1)安装SWT SWT应用程序要求以Eclipse项目中下载并安装SWT类库 2)hello.swt Swt提供了三个能够在Display对象上调用的方法:asyncExec(Runnable),syncExec(Runnable)和timerExec(int, Runnable) 3)根除冗余代码 4)菜单 5)页签面板,按钮和事件 Swt有大量的控件集,它们被称为部件 6)图形 在swt中基本的绘图面是canvas 7)Swt中的并发 Swt不容许多线程编写显示功能 8)Swt仍是Swing 使用Swing:首先,为用户在使用你的应用系统时提供一种更加透明的体验,其次,若是认为swt提供的可响应性很重要,不然,Swing就多是恰当的选择。