资源描述
单击此处编辑母版标题样式,第一级,第二级,*,图形用户界面设计,第十章,回顾,掌握多线程的概念,掌握如何创建线程,了解死锁的概念,了解线程同步,了解使用,wait(),和,notify(),在线程之间进行通信,2,目标,GUI,相关概念,布局管理器,事件处理,常用,Swing,组件,3,10.1.1 GUI包和简单GUI程序2-1,1,java.awt,包,称为抽象窗口工具集,AWT(Abstract Window Toolkit),,是使用,Java,进行,GUI,设计的基础。,2,javax.swing,包,Swing,组件存放在,javax.swing,包中。几乎所有,AWT,组件对应有新功能更强的,Swing,组件。另外还加入了一些全新的组件。,Swing,组件在名称上前面多了一个字母“,J”。,4,10.1.1 GUI包和简单GUI程序2-2,3设置,GUI,应用程序的流程:,(1)引用需要的包和类。,(2)设置一个顶层的容器。,(3)根据需要为容器设置布局管理器或使用默认布局管理器。,(4)将组件添加到容器内,位置自行设计。,(5)为响应事件的组件编写事件处理代码。,5,10.1.2 容器、组件、布局和观感,1.,容器和组件,组件是可以用图形化的方式显示在屏幕上并能够与用户进行交互的对象。,容器是一种特殊的组件,一种能够容纳其他组件或容器的组件。,2.布局管理器,为了使图形用户界面具有良好的平台无关性,提供了专门用来管理组件在容器中的布局的工具。,3.观感,决定,swing,应用程序的外观。,6,10.2 布局管理器,Java,中的,布局类型包括以下几种:,FlowLayout,(,流式布局),BorderLayout,(边界布局),GridLayout,(网格布局),CardLayout,(卡片布局),GridBagLayout,(网格包布局),7,10.2.1 FlowLayout布局管理器,FlowLayout,的构造函数有:,FlowLayout,(),:,生成一个默认的流式布局,FlowLayout(int,alignment),:,可以设定每一行组件的对齐方式,FlowLayout(int,alignment,int,horz,int,vert,),:,可以设定组件间的水平和垂直距离,Applet,和面板的缺省布局,组件从左上角开始按从左到右、从上到下的方式排列,FlowLayout mylayout=new FlowLayout();,FlowLayout exLayout=new,FlowLayout(FlowLayout.RIGHT);,setLayout(exlayout);/,为容器设置新布局,8,10.2.2 BorderLayout布局管理器,下面是,BorderLayout,所定义的构造函数:,-,BorderLayout,(),:,生成默认的边界布局,-,BorderLayout(int,horz,int,vert,),:,可以设定组件间的,水平和垂直距离,窗口,、,框架和对话框等的缺省布局,组件被置于容器的北、南、东、西或中间位置,.,setLayout(new BorderLayout();,Button btnEast=new Button(,东);,Button btnWest=new Button(,西);,Button btnNorth=new Button(,北);,Button btnSouth=new Button(,南);,Button btnCenter=new Button(,中);,add(btnEast,BorderLayout.EAST);,add(btnWest,BorderLayout.WEST);,add(btnNorth,BorderLayout.NORTH);,add(btnSouth,BorderLayout.SOUTH);,add(btnCenter,BorderLayout.CENTER);,9,10.2.3 GridLayout布局管理器,GridLayout,的构造函数如下所示:,-,GridLayout,(),:,生成一个单列的网格布局,-,GridLayout(int,row,int,col,),:,生成一个设定行数和列数的网格布局,-,GridLayout(int,row,int,col,int,horz,int,vert,),:,可以设置组件之间的水平和垂直间隔,用于将容器区域划分为一个矩形网格,组件按行和列排列,.,Button btn;/,声明按钮数组,String str=1,2,3,4,5,6,7,8,9;,setLayout(new GridLayout(3,3);,btn=new Buttonstr.length;/,创建按钮数组,for(int i=0;istr.length;i+),btni=new Button(stri);add(btni);,10,10.2.4 CardLayout布局管理器,可存储几个不同的布局。,每个布局就像是一个卡片组中的一张卡片。,在一个给定的时间总会有一张卡片在顶层。,卡片通常为一个,Panel,对象。,每当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局。,11,10.2.5 GridBagLayout布局管理器,通过使用以下语法容器可获得,GridBagLayout,:,GridBagLayout,gb,=new,GridBagLayout,();,ContainerName.setLayout(gb,);,要使用此布局,必须提供各组件的大小和布局等信息。,GridBagConstraints,类中包含,GridBagLayout,类用来定位及调整组件大小所需的全部信息。,组件大小不必相同,组件按行和列排列,放置顺序不一定为从左至右和由上至下,12,GridBagConstraints 类 2-1,成员变量列表:,gridx,gridy,:,指定组件放置于哪个单元中,gridwidth,gridheight,:,指定组件将占用多少行和多少列,weightx,weighty,:,指定在一个,GridBagLayout,中应如何分配空间,这些变量的缺省值为 0,ipadx,ipady,:,指定组件的最小高度和宽度,13,成员变量列表:,fill,:,指定在单元大于组件的情况下,,,组件如何填充此单元,共有4可选值。缺省值为:,GridBagConstraints,.NONE,anchor,:,指定将组件放置在单元中的位置,共有9个可选值。缺省值为:,GridBagConstraints,.CENTER,GridBagConstraints 类2-2,14,10.2.6 swing布局管理器,1.,BoxLayout,布局管理器,按照从上到下(即,Y,轴)或者从左到右(即,X,轴)的顺序来依次排列组件。,2.,ScrollPaneLayout,布局管理器,是,JScrollPane,中的内置布局管理器,所以不需要单独创建,会自动设置。,15,10.2.7 Null布局管理器,在某些情况下,用户不想使用布局管理器,需要自己设置组件的位置和大小,这时应取消容器的布局管理器,然后再进行设置,否则用户自定义设置将会被布局管理器覆盖。取消布局管理器的方法是:,setLayout(null);,用户使用,setLocation()、setSize()、setBounds(),等方法为组件设置位置和大小。需要注意的是,这种方法会导致程序与系统相关,如不同的分辨率会产生不同的效果。,16,10.3.1 事件处理模型,Java,最新的事件处理方法是基于授权事件模型,当事件来源对象因用户的操作(鼠标或键盘),系统会自动触发此事件类对象,E,,并通知所授权的事件监听者,A(,若来源对象已向,A,注册),事件监听者,A,中有处理各种事件的方法(事件处理者1,n),便会处理此事件,E,的各种状况,。,17,10.3.2 事件层次结构2-1,事件类,说明,事件源,ActionEvent,通常按下按钮,双击列表项或选中一个菜单项时,就会生成此事件。,Button、List、MenuItem、TextField,AdjustmentEvent,操纵滚动条时会生成此事件。,Scrollbar,ComponentEvent,当一个组件移动、隐藏、调整大小或成为可见时会生成此事件。,Component,ItemEvent,单击复选框或列表项时,或者当一个选择框或一个可选菜单的项被选择或取消时生成此事件。,Checkbox、CheckboxMenuItem、Choice、List,FocusEvent,组件获得或失去键盘焦点时会生成此事件。,Component,18,10.3.2 事件层次结构2-2,事件类,说明,事件源,KeyEvent,接收到键盘输入时会生成此事件。,Component,MouseEvent,拖动、移动、单击、按下或释放鼠标或在鼠标进入或退出一个组件时,会生成此事件。,Component,ContainerEvent,将组件添加至容器或从中删除时会生成此事件。,Container,TextEvent,在文本区或文本域的文本改变时会生成此事件。,TextField、TextArea,WindowEvent,当一个窗口激活、关闭、,失效、恢复、最小化、打开或退出时会生成此事件。,Window,19,10.3.3 事件处理方法,实现事件监听器接口法:,首先给组件注册监听器,使用下列方法:,addxxxListener,(,事件监听器对象);,确定了事件监听器的类型后,必须在程序中定义类来实现这些接口,重写接口中的所有方法。,addKeyListener(new CharType();,public class CharType implements KeyListener,public void keyPressed(KeyEvent e)/,大括号中为处理事件的代码,public void keyReleased(KeyEvent e)/,未用到此方法,所以方法体为空,public void keyTyped(KeyEvent e),20,10.3.4 事件适配器,使用实现事件监听器接口的方法处理事件时,必须重写监听器接口中的所有方法,尽管有些方法不会用到。,继承事件适配器类,只需要重写所需要的方法即可。,addKeyListener(new CharType();,为事件源注册事件监听器的方法同上。,public class CharType extends KeyAdapter,public void keyPressed(KeyEvent e)/,大括号中为处理事件的代码,21,10.4.1 常用容器组件3-1,是,放置其他,Swing,组件的顶级容器,JFrame,组件用于在,Swing,程序中创建窗体,它的构造函数:,JFrame,(),JFrame(String,Title),组件必须添加至内容窗格,而不是直接添加至,JFrame,对象,示例:,frame.getContentPane().add(b,);,22,10.4.1 常用容器组件3-2,JPanel,组件是一个中间容器,用于将小型的轻量级组件组合在一起,JPanel,的缺省布局为,FlowLayout,JPanel,具有下列构造函数:,JPanel,(),JPanel(LayoutManager,lm),23,10.4.1 常用容器组件3-3,JApplet,也是一种窗口容器,继承自,Applet,类,,Applet,小程序是另一种,Java,程序,与,Applet,不同的是,它默认的布局管理器是,JAppletBorderLayout,,,而,Applet,默认的布局管理器是,FlowLayout,。,可直接向,Applet,窗口中添加组件,但,JApplet,不行,添加组件时必须添加到其内容窗格
展开阅读全文