一、MouseEvent
每个鼠标事件处理方法都将MouseEvent对象作为它的实参。
MouseEvent对象包含关于所发生的鼠标 事件的信息。包括事件发生所在位置的X、Y坐标。
InputEvent(MouseEvent的超类)中的方法和常量,使程序能判断用户按下的是哪个鼠标按钮。
二、适配器类
对于具有多个方法的许多事件监听接口,Java.awt.event和Java.swing.event包 提供了事件监听器的适配器类。
适配器类实现相应的接口,并提供接口中的每个方法的默认实现(方法体为空)。
编程时可以扩展适配器类,继承每个方法的默认实现,进而只重写需要用于事件处理的那些方法。(对其他不需要涉及的方法,可以不去实现)
eg. addMouseListener( new MouseAdapter() {……} )
三、JDesktopPane和JInternalFrame
多文档界面的程序(MDI),就是用一个包含其他窗口的主窗口来并行的管理多个 打开的文档。
用户可以在不同的文档间切换,不必先关闭一个再打开另一个。
JDesktopPane是用于管理JInternalFrame的子窗口容器。可用于实现多文档界面程序。
四、选项卡JTabbedPane
JTabbedPane将GUI组件按不同的层次管理,每次只有一层是可见的。
用户通过选项卡访问每个层次。
任何组件都可以放置到选项卡中。
五、键盘事件
当按下和释放键盘上的键时,会发生键盘事件KeyEvent。
处理键盘事件的接口KeyListener,定义了如下方法:
(1)keyPressed();(当按下任何键时)
(2)keyTyped();(当按下不为动作键的任何键时)
(3)keyReleased()。(当在任何keyPressed或者keyTyped事件之后释放键时)
六、可插入式外观
Swing可插入外观使得组件和组件绘制相分离,这样应用程序可以在运行的时候动 态改变外观而不影响程序的功能。
对每一个Swing组件,外观包都包含许多 Swing 个UI类和一个 LookAndFeel的子类.
以UI结尾的类是为Swing组件提供用户界面的,如BasicButtonUI、MetalButtonUI等 ,它们是实际上进行组件绘制的类。
LookAndFeel子类提供了构建特定外观的全局信息,包括组件颜色、字体、边框等。
七、UIManager
UIManager包含嵌套类LookAndFeelInfo ,维护关于外观的信息。
UIManager类负责选择外观,它最重要的功能就是提供了一种方便的手段来获取当前 外观的相关信息,当一个外观被选中的时候,它创建自己的 UIDefaults表,而UIManager中的getDefaults方法则提供了访问这个表的功能。
通过调用UIManager类的setLookAndFeel方法来设定当前外观。
八、程序、进程和线程
程序(program):是对数据描述与操作代码的集合,是应用程序执行的脚本,以文件的形式存储在磁盘。
进程:是一个程序在其自身的地址空间中的一次执行活动。(一个程序的运行就是一个进程从创建、运行到消亡的过程。)进程是资源申请、调度和独立运行单位,因此 它使用系统中的运行资源,是操作系统分配资源的基本单位。同一个程序可以被加载到系统的不同内存区域分别执行,形成不同的进程。
线程:是进程中的一个单一的连续控制流程。一个进程中可以包含多个线程,每个进程至少包含一个线程,所以会自动创建一个线程,这个线程通常称为主线程。线程又称为轻量级进程,和进程一样,拥有独立的执行控制,由操作系统负责调度,也可以由用户程序控制。
与进程的区别在于:线程没有独立的存储空间,而是和所属进程中的其他线程共享一个存储空间,使得线程间的通信较进程简单。
线程是与操作系统相关联的,不同的操作系统以不同的方式表示线程。
从程序设计语言的角度看看“多线程程序设计”的实际意义是将程序从逻辑上分割为多个任务来同步完成,而程序员不必关系到底使用了多少个处理器。
九、创建并执行线程
在java的历史版本中,有两种创建多线程程序的方法:
(1)通过创建Thread类的子类来实现
(2)通过实现Runnable接口的类来实现(推荐)
十、通过Thread类实现多线程
(1)设计Thread的子类
(2)根据工作需要重新设计线程的run方法:
线程类Thread中提供的run是一个空方法。为此,我们可以继承Thread,然后覆盖 (override) run,使得该线程能够完成特定的工作。
(3)使用start方法启动线程,将执行权转交到run。
十一、通过Runnable接口创建线程
主要步骤:
(1)创建某个类实现Runnable接口,实现run()方法。
(2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。
(3)调用Thread的start方法。
十二、线程类型
后台线程:如果一个程序中只有后台线程在运行时,程序会立即退出。后台线程常用于为其他线程提供服务。后台线程常用于为其他线程提供服务。(非独立存在)
用户线程:如一个程序存在正在运行的用户线程,该程序不会退出。
类java.lang.Thread的成员方法:public final boolean isDaemon( )
//判断该线程是否为后台线程
类java.lang.Thread的成员方法 public final void setDaemon(boolean on)
//决定是否将用户线程切换为后台线程
十三、线程组
线程组是一些线程和线程组的集合,形成树状体系结构。
十四、使用线程池管理线程
Java5.0对线程操作做了许多扩展,线程池就是其中之一。
线程池的基本思想: 开辟一块内存空间,里面存放了若干(未死亡)的线程,这些线程由池管理器来进行调度执行。当有任务时,从池中取一个线程来处理该任务, 任务完成后线程对象归池。这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。(为部分线程由线程池事现分配好资源)
线程池的种类:固定尺寸的线程池;可变尺寸线程池。
创建一个线程池,需要使用 java.util.concurrent.Executors类的 API,它是Executor的工厂类,通过Executors可以创建你所需要的Executor。这个类提供大量创建线程池的静态方法。
十五、创建固定大小的线程池
public static ExecutorService newFixedThreadPool(int nThreads):创建固定数目线程的线程池。
当要加入的池的线程(或者任务)超过池最大尺寸时候,需要排队等待。
一旦池中有线程完毕,则排队等待的某个线程会入池执行。
十六、ExecutorService
ExecutorService接口扩展了Executor接口 ,并添加了一些线程池生命周期管理的方法。
一个Executor的生命周期有三种状态:运行、关闭、终止 。
Executor创建时处于运行状态。
当调用ExecutorService.shutdown()后,处于关闭状态。这时,不应再向Executor中添加任务。
所有已添加的任务执行完毕后,线程池关闭,Executor处于终止状态。
如果Executor处于关闭状态时往Executor提交任务,会抛出uncheckedexceptionRejectedExecutionException。
可以使用Executor中定义的execute的方法来运行一个Runnable对象。(即把对象交付给线程池)
ExecutorService.isTerminated()方法检测线程是否已经运行结束。
eg. ExecutorService executor = Executors.newFixedThreadPool(NTH REDS);
Runnable worker = new MyThread();
executor.execute(worker);//创建线程运行这个任务或者将这个任务放入队列
十七、创建单任务线程池
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的ExecutorService对象, 这个对象只有一个线程用于执行任务。若任务多余一个,任务将按先后顺序执行。