AWT的基础知识
GUI全称Graphical User Interface即图形用户界面
JDK中提供了AWT和Swing两个包,用于GUI程序的设计和开发
GUI组件可以分为两大类:基本组件和容器,分别是java.awt.Component和java.awt.Container的直接或间接子类
程序的GUI部分由AWT线程管理
事件处理机制
事件:用户对组件的一个操作,称之为事件。
事件源:发生事件的组件就是事件源。
事件处理器:某个java类中的负责处理事件的成员方法。
事件分类
按产生事件的物理操作和GUI组件的表现效果进行分类:
MouseEvent
WindowEvent
ActionEvent
按事件的性质分类:
低级事件
语义事件(高级事件)
事件监听器
一个事件监听器对象负责处理一类事件。
一类事件的每一种发生情况,分别由事件监听器对象中的一个方法来具体处理。
在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口。
事件监听器接口类的名称与事件类的名称是相对应的,例如,MouseEvent事件类的监听器接口名为MouseListener。
处理发生在某个GUI组件上的XXXEvent事件的某种情况,其事件处理的通用编写流程:
编写一个实现了XXXListener接口的时间监听器类
事件适配器
JDK中也提供了大多数事件监听器接口的最简单的实现类,称之为事件适配器类
用事件适配来处理事件,可以简化事件监听器编写
事件处理的多重运用
如何知道一个GUI组件到底能够触发哪几种事件?
一个组件上的一个动作可以产生多种不同类型的事件
一个事件监听器对象可以注册到多个事件源上
在一个事件源上也可以注册对同一类事件进行处理的多个事件监听器对象
修改组件的默认事件处理方式
只有在一个组件上注册了某种事件的事件监听器对象后,组件才会产生相应的事件对象。
默认的processEvent方法调用响应的processXxxEvent方法。
调用enableEvents(long eventsToEnable)方法,可以在即时没有注册事件监听器的情况下,组件也能够对某些类型的事件进行响应和产生相应的事件对象。
Graphics类与图形绘制
Component.getGraphics方法与Graphics类
Graphics.drawLine(int x1,int y1,int x2,int y2)方法
Graphics.drawString(String str,int x,int y)
Graphics.drawString方法的坐标参数
组件重绘的处理
组件重绘的原理
Paint(Graphics g)的作用
AWT线程对组件重绘的调用过程
图像显示
使用Graphics.drawImage(Image img ,int x,int y,ImageObserver boserver)方法显示图像
使用Component.getToolkit.getImage(String path)语句获取得Image实例对象
双缓冲技术
Component.createImage方法创建内存Image对象。
在Image对象上进行绘制的结果就成了一副图像。
在Image对象上执行与组件表面同样的绘制,Image对象中的图像是组件表面内容的复制,当组件重画时,只需将内存中的Image对象在组件上画出。
Canvas
Canvas是具有基本的和最简单的GUI功能的组件
Canvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能够捕获用户的操作,产生相应事件。
当要设计自定制的具有GUI功能的组件类时,继承Canvas将会简化编程难度、
菜单
一个完整的菜单系统由菜单条,菜单,菜单项组成,他们之间关系:
Java中与菜单相关的类主要有:MenuBar菜单条,Menu菜单,MenuItem菜单项
setAcionCommand方法的作用
Container
Container类是所有容器类的父类,Container.add方法用于将组件添加到容器中。
Container也是Component子类,因此也可作为组件增加到其他容器上。
Dialog与FileDialog类
Dialog类用于产生对话框
模态对话框和非模态对话框
Dialog类的两个构造方法:
Public Dialog(Frame owner,String title)
Public Dialog(Frame owner,String title,boolean modal)
Checkbox
Checkbox类用来建立单选按钮和多选按钮(复选框)。
创建多选按钮,只需要使用构造函数。
Checkbox(String label,boolean state)
创建单选按钮,需要使用构造函数
Checkbox(String label,boolean state,CheckboxGroup, group)
单选按钮和多选按钮的语义事件为ItemEvent,对应的监听器接口为ItemListener,该接口只有一个itemStateChanged方法。
Choice
Choice类用来制作单选下拉列表框,如图所示:
Choice类的语义事件为ItemEvent,对应的监听器接口为ItemListener,该接口中只有一个itemStateChanged方法。
Panel与ScrollPane类
Panel类是一个容器类,用于产生一种特殊的空白面板,可以容纳其他的组件,但不能独立存在。
ScrollPane类是一种容器类,用于产生滚动窗口,通过滚动条在一个较小的容器窗口中显示较大的子部件。
布局管理器
一个容器中的各个组件之间的位置和大小关系称之为布局
Java语言提供了布局管理器来管理组件在容器中的布局,而不是直接使用位置坐标来设置各个组件的位置和大小。
AWT中的布局管理器类。
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
GridLayout
GridLayout布局管理器将容器划分为若干行列的网格,在容器上添加组件时,他们会按从左到右,从上到下的顺序在网格中排列。
在GridLayout的构造方法中,需要指定在容器上划分的网格的行,列数。
CardLayout
CardLayout布局管理器能够实现将多个组件放在同一容器区域内的交替显示,相当于多张卡片摞在一起,在任何时候都只有最上面的一个可见。
编程实例:创建两个Panel对象,每个Panel上都能拥有一个布局管理器,左边的Panel使用GridLayout布局管理器放置了三个按钮,右边的Panel上使用了CardLayout布局管理器来放置卡片,最后在窗口上使用BorderLayout放置这两个Panel面板。右边的Panel中带有5张卡片(用5个按钮模拟),按下左边Panel中的prev按钮,依次向前显示,按下three按钮,显示第三张卡片。
取消布局管理器
调用Container.setLayout(null)方法取消布局管理器设置,在这种情况下,可以调用Component.setBounds方法来用绝对坐标设置容器上的每个组件的大小和位置。
不使用布局布局管理器将会给程序带来一个潜在的问题,当容器大小改变时,所有组件仍保持原来的位置和大小,将导致整个程序界面比较难看。
Swing和JFC
所有的Swing组件,位于javax.swing包中,它们是构筑在AWT上层的GUI组件,Swing组件是JComponent类的子类,JComponent又是java.awt.Container的子类。
保证可移植性
Swing提供了比AWT更多的组件库,eg.JTable,JTree,JComboBox
Swing也增强了AWT中原有组件的功能,如与AWT中的Button对应的Swing组件是JButton.
JFC(java Foundation Class)是指Sun对早期的JDK进行扩展的部分,集合了Swing组件和其他能简化开发的API类,包括Swing,java 2D,accessibility,internationalization。
JFrame
JFrame是与AWT中的Frame相对应的Swing组件。
JFrame上面只能有一个唯一的组件,这个组件为JRootPane,调用JFrame.getContentPane()方法可获得JFrame中内置的JRootPane对象。
应用程序不能直接在JFrame实例对象上增加组件和设置布局管理器,而应该在JRootPane对象上增加子组件和设置布局管理器。
调用JFrame的setDefaultCloseOperation方法,可以设置单击窗口上的关闭按钮时的事件处理方式,例如,当设置值为JFrame.EXIT_ON_CLOSE,单击窗口上关闭按钮,直接关闭程序。
JScrollPane
JScorllPane是与AWT中的ScrollPane相对应的Swing组件。
最基本的JScrollPane由水平和垂直向上的JScrollBar,以及一个JViewport组成。
调用JSrollPane.getViewport方法,可以获得代表滚动窗口中的视图区域JViewport对象。
调用JViewport.setView方法,可以将滚动窗口中要显示的内容作为子组件增加到JViewport上。
Swing中的标准对话框
JOptionPane类提供了若干个showXxxDialog静态方法,可用来产生简单的标准对话框。
showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType)中的每个参数的意义。
JFileChooser类专门用来实现文件存取对话框。