1、,第十章,GUI编程之AWT,学习目标,能够熟练的创建和管理窗口,管理字体和颜色、输出文本和使用图形。能够熟练的使用AWT中的各种组件,如按扭、文本框以及系统托盘和启动画面等。理解java的事件处理机制,熟练使用事件做出反应灵敏的图形化界面。,AWT类的层次结构,Component类 - 1,Component类是AWT中最上层的根类,所以了解Component类提供的方法对于学习AWT的组件来说是必要的。成员方法:public Color getBackground()public void setBackground(Color c)public Color getForeground()
2、 public void setForeground(Color c),Component类 - 2,成员方法:public Font getFont() public void setFont(Font f)public FontMetrics getFontMetrics(Font font)public Dimension getSize()public void setSize(Dimension d)public void setSize(int width,int height),Component类 - 3,成员方法:public Point getLocation()publi
3、c void setLocation(int x,int y)public Rectangle getBounds()public void setBounds(int x,int y,int w,int h)public boolean isVisible()public void setVisible(boolean b)public boolean isEnabled()public void setEnabled(boolean b),Component类 - 4,成员方法:public void paint(Graphics g)public void repaint()public
4、 void update(Graphics g)public Container getParent()public Cursor getCursor()public void setCursor(Cursor cursor)public Toolkit getToolkit(),Component类 - 5,成员方法:public Dimension getMaximumSize()public Dimension getMinimumSize()public Dimension getPreferredSize()public Image createImage(int width,int
5、 height) 上述方法是Component类中比较常用的行为,其它方法请参照API 文档。,Container类 - 1,Container类是一种特殊的Component,它可以容纳其他的Component。成员方法:public LayoutManager getLayout()public void setLayout(LayoutManager mgr)public Component add(Component comp)public void add(Component comp,Object constraints),Container类 - 2,成员方法:public vo
6、id remove(Component comp)public void remove(int index)public void removeAll()public void validate()public Component getComponents() 上述方法是Container类中比较常用的行为,其它方法请参照API 文档。,Window类 - 1,Window是AWT的窗口类,它的特点是无标题栏、无边框、无最大最小和关闭按钮、不能在可视化状态下改变其外观。成员方法:public void dispose()public void pack()public void show()
7、,Window类 - 2,成员方法:public void addWindowListener(WindowListener l)public void removeWindowListener(WindowListener l) 上述方法是Window类中比较常用的行为,其它方法请参照API 文档。,Frame类 - 1,Frame是Window的子类,是AWT界面的根窗体,包含标题栏、边框、最大最小和关闭按扭等,默认布局是BorderLayout。构造方法:public Frame()public Frame(String title),Frame类 - 2,成员方法:public Str
8、ing getTitle()public void setTitle(String title)public boolean isResizable()public void setResizable(boolean resizable)public MenuBar getMenuBar()public void setMenuBar(MenuBar mb)其它方法请参照API文档。,Label类 - 1,Label是使用最简单的一种组件,它包含一个它要显示的字符串。成员:public static final int LEFTpublic static final int CENTERpub
9、lic static final int RIGHT,Label类 - 2,构造方法:public Label()public Label(String text)public Label(String text,int alignment)成员方法:public String getText()public void setText(String text),Label类 - 3,成员方法:public int getAlignment()public void setAlignment(int alignment) 其它方法参照API文档。,Button类 - 1,Button是使用最广泛
10、的组件-按钮,它包含一个显示其上的标签。构造方法:public Button()public Button(String label)成员方法:public String getLabel()public void setLabel(String label),Button类 - 2,成员方法:public void addActionListener(ActionListener listener)public void removeActionListener(ActionListener listener) 其它方法参照API文档。,布局管理器 - 1,布局管理器是容器管理其中组件的一种
11、方法,用于在容器内按照一定的顺序来排列组件。AWT中一共有五大布局管理器。 (1)GridLayout用于将容器平均分配成m行n行。 注意,如果添加的组件数量与前面分配 的数量有较大差,会导致GridLayout的行列数发生自动修正。,布局管理器 - 2,范例解析:AWTSimple.javaimport java.awt.*; public class AWTSimple private Frame f; private Button b1,b2,b3; public AWTSampl() f = new Frame(AWTSimple testing); b1 = new Button(A
12、); b2 = new Button(B);,布局管理器 - 3,b3 = new Button(C); f.setLayout(new GridLayout(3,1,10,10); f.add(b1); f.add(b2); f.add(b3); f.setSize(400,300); f.setVisible(true); ,布局管理器 - 3,public static void main(String args) AWTSimple x = new AWTSimple(); 上述代码能够生成一个简单AWT界面,包含三个按钮。,布局管理器 - 4,(2)BorderLayout用于将容器
13、按东南西北中五个方向进行分配。成员:public static final String NORTHpublic static final String SOUTH public static final String WESTpublic static final String EASTpublic static final String CENTER,布局管理器 - 5,构造方法:public BorderLayout()public BorderLayout(int hgap,int vgap)练习:完成下图。,布局管理器 - 6,(3)FlowLayout摆放组件的方式是从按照对齐方式
14、顺序排列。当一行上不再能放下更多的组件时,下一个组件将被摆放在下一行。成员:public static final int LEFTpublic static final int RIGHTpublic static final int CENTER,布局管理器 - 7,构造方法:public FlowLayout()public FlowLayout(int align) public FlowLayout(int align,int hgap,int vgap),布局管理器 - 8,(4)还有两种布局管理器CardLayout和GridBagLayout不常用,请自行参照API。 (5)空
15、布局 ,就是将容器的布局管理器设置为null。对于空布局的容器,添加组件前,必须先指明组件在容器中的起始位置以及大小,然后才能添加到组件中。 练习:使用空布局完成一个GUI界面设计。,Panel类,Panel是个容器,它可以将容纳其他的容器(Frame除外)和组件,默认布局管理局FlowLayout。Panel中可以摆放若干组件,然后将Panel作为一个组件放入底层容器,这样就可以做出各种各样的GUI界面。构造方法:public Panel()public Panel(LayoutManager layout) 练习:使用Panel类完成GUI界面设计。,事件处理,Java中的事件处理模型分成
16、两类,分别是等级事件模型和委托事件模型。 在JDK 1.1.8之后,java全部采用委托事件模型来处理事件,在委托事件模型的处理机制中,一次典型的事件处理过程涉及三类对象。事件源对象事件对象事件监听器对象,EventObject类,EventObject类是awt中事件类的最上层根类。构造方法:public EventObject(Object source)成员方法: public Object getSource(),事件类层次关系,监听器层次关系,范例解析,练习:为Button添加事件处理。 在完成GUI界面设计后添加如下四步:导入java.awt.event包。 定义监听器对象。对事件
17、源添加监听器。覆盖监听器接口的方法。,事件监听器的适配器类,WindowListener接口,成员方法:public void windowClosing(WindowEvent e)public void windowActivated(WindowEvent e)public void windowDeactivated(WindowEvent e)public void windowIconified(WindowEvent e)public void windowDeiconified(WindowEvent e)public void windowOpened(WindowEvent
18、 e)public void windowClosed(WindowEvent e),ComponentListener接口,成员方法:public void componentHidden(ComponentEvent e)public void componentMoved(ComponentEvent e)public void componentResized(ComponentEvent e)public void componentShown(ComponentEvent e),ContainerListener接口,成员方法:public void componentAdded(
19、ContainerEvent e)public void componentRemoved(ContainerEvent e),TextComponent类 - 1,TextComponent类中定义了AWT中两种文字输入组件共用的一些方法。成员方法:public String getText()public void setText(String t)public int getSelectionStart()public void setSelectionStart(int selectionStart),TextComponent类 - 2,成员方法:public int getSele
20、ctionEnd()public void setSelectionEnd(int selectionEnd)public String getSelectedText()public void select(int selectionStart,int selectionEnd)public void selectAll()public boolean isEditable()public void setEditable(boolean b),TextComponent类 - 3,成员方法:public void addTextListener(TextListener l)public
21、void removeTextListener(TextListener l),TextField类 - 1,TextField是TextComponent类的子类,实现了一个单行的文本输入区域,通常称为“文本框”。构造方法:public TextField()public TextField(String text),TextField类 - 2,成员方法:public char getEchoChar()public void setEchoChar(char c)public boolean echoCharIsSet()public void addActionListener(Act
22、ionListener l)public void removeActionListener(ActionListener l)练习:完成 一个简单加减乘除计算机器。,TextArea类,TextArea是多行的“文本区”。构造方法:public TextArea()public TextArea(String text)成员方法:public void append(String str)public void insert(String str,int pos)public void replaceRange(String s,int start,int end),复选框和单选按钮,复选框
23、:Checkbox类 单选按钮:是将若干Checkbox归为一个组,则同一个组中的Checkbox有互斥关系。 练习:完成下图。,下拉列表和列表,下拉列表:Choice类。 列表:List类。 练习:完成下图。,对话框 Dialog类 - 1,用户经常会遇到这样的情况,那就是需要使用对话框来容纳一系列相关的组件。对话框主要用于得到用户的输入内容。它们与Frame窗口非常类似,只不过对话框总是顶级窗口的子窗口中。在其他方面,对话框的功能与Frame窗口非常相似。例如,给对话框添加组件的方法就与给Frame窗口添加组件的方法完全一致。,对话框 Dialog类 - 2,构造方法:public Dia
24、log(Frame owner,String title,boolean modal)public Dialog(Dialog owner,String title,boolean modal)成员方法:public String getTitle()public void setTitle(String title),对话框 Dialog类 - 3,成员方法:public boolean isResizable()public void setResizable(boolean resizable)public void setVisible(boolean b)public boolean
25、 isModal()public void setModal(boolean b),对话框 FileDialog类 - 1,Java提供了内置的文件选择对话框让用户指定文件。要创建一个文件对话框,实例化FileDialog类型的对象。它可以使文件对话框显示出来。成员:public static final int LOADpublic static final int SAVE,对话框 FileDialog类 - 2,构造方法:public FileDialog(Frame parent,String title, int mode)成员方法:public String getDirector
26、y()public void setDirectory(String dir)public String getFile()public void setFile(String file),对话框 FileDialog类 - 3,成员方法:public int getMode()public void setMode(int mode)public FilenameFilter getFilenameFilter()public void setFilenameFilter(FilenameFilter filter)练习:完成 对FileDialog类的测试。,菜单类层次关系,菜单类组件,菜
27、单栏 MenuBar菜单 Menu菜单项 MenuItem可核选式菜单项 CheckboxMenuItem弹出式菜单 PopupMenu,菜单组件范例解析,桌面API - 1,桌面API有助于无缝地把Java应用程序与桌面集成到一起,主要有三个功能: 1、支持Java应用程序使用一个特定的统一资源标识符 (URI)启动操作系统的缺省的浏览器; 2、启动操作系统缺省的电子邮件客户端; 3、启动应用程序以打开、编辑或打印与该应用程序相关联的文件。,桌面API - 2,练习:使用Desktop类完成三个功能:(1)启动浏览器显示一个HTML页;(2)启动系统默认的电子邮件客户端;(3)启动应用程序以
28、打开、编辑相关文件。,系统托盘 - 1,桌面的系统托盘在 Microsoft Windows 上,它被称为“任务栏状态区域” 。 每个 Java 应用程序都有一个 SystemTray 实例,在应用程序运行时,它允许应用程序与桌面系统托盘建立连接。 TrayIcon 对象表示可以添加到系统托盘的托盘图标。TrayIcon 可以包含工具提示、图像、弹出菜单和一组与之关联的监听器。,系统托盘 - 2,练习:完成右图中的GUI界面,并为该应用提供系统托盘的功能。要求写两个文件,一个是能够生成系统托盘的工厂类,另一个完成下图的内容。,系统启动画面 - 1,现在很多软件在启动时都有初始化过程,有时初始化
29、的时间会很长,如Photoshop、Flash等,为了让用户有耐心继续等待,不要误以为死机了,这些软件在初始化之前总是显示一个图形界面来告诉用户软件正在做什么,这就是“系统 启动画面”。 在JDK 1.6中提供了一个简单的方法,可以不添加一行代码,而且在界面要改变时还不需要重新编译源程序。,系统启动画面 - 2,范例解析:import java.awt.Frame;public class TestSplash extends Frame public static void main(String args) TestSplash x = new TestSplash();public Te
30、stSplash() try /程序在此位置阻塞3000毫秒Thread.sleep(3000);,系统启动画面 - 3, catch (InterruptedException e) e.printStackTrace();initialize();private void initialize() this.setSize(300, 200);this.setTitle(test splash);this.setVisible(true);,系统启动画面 - 4,为了让我们上面的程序在运行时能够显示启动画面,需要为它配置一下启动参数,例如: java -splash:files/start
31、.jpg TestSplash,字体和颜色,在AWT中有一些虽然不是组件,但是它们是组件相关的支持类,非常重要,比如组件的颜色、组件上文字的字体等。 (1)Font 代表字体类。 (2)Color 代表颜色类。,滚动面板和滚动条(附加),(1)ScrollPane代表的组件是滚动面板,当滚动面板中容纳的组件大于滚动面板的外观尺寸时,滚动面板可以出现滚动条用于让用户可以调节面板中显示的内容。 (2)Scrollbar是滚动条,用来在指定的最小值和最大值之间选择连续数值。 (3)滚动条能够触发的事件是AdjustmentEvent。,低级事件和焦点事件(附加),鼠标事件 MouseEvent监听器
32、 MouseListener、MouseMotionListener键盘事件 KeyEvent监听器 KeyListener焦点事件 FocusEvent监听器 FocusListener,控制鼠标指针形状(附加) - 1,在Component类中有一个setCursor方法用于设置鼠标指针的形状,调用时需要传递一个Cursor对象。,控制鼠标指针形状(附加) - 2,构造方法:public Cursor(int type)public static Cursor getPredefinedCursor(int type) 练习: 写一段程序,实现功能是:当鼠标进入Label区域内时,鼠标形状变成“手”状。,小结,本单元详细讲述了图形界面的基础部分-AWT,涉及到十余种组件,除组件相关的方法外,还需要大家掌握的是布局管理器以及颜色、字体等支持类的使用。 对于在JDK 1.6中出现的系统桌面、系统托盘和启动画面三部分内容,大家应该熟练掌握。 事件处理机制是GUI编程中的重点,应该理解事件处理的过程,能够灵活运用。,谢 谢!,