第8章图形用户界面.ppt_第1页
第8章图形用户界面.ppt_第2页
第8章图形用户界面.ppt_第3页
第8章图形用户界面.ppt_第4页
第8章图形用户界面.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章 图形用户界面,本章任务: 了解图形用户界面基本组件的使用方法 了解如何使用布局管理器对组件进行管理 了解如何使用Java的事件处理机制,本章主要内容,1.组件 2.组件布局管理 3.事件处理方法,8.1 组件,组件(Component)是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。 组件一般作为一个对象放置在容器(Container)内,容器是能容纳和排列组件的对象,如Applet、Panel、Frame等。 通过容器的add方法把组件加入到容器中。,8.1.1 标签,1创建标签 标签(Label)的功能是显示单行的字符串,可在屏幕上显示一些提示性、说

2、明性的文字。例如,在列表框的旁边加上一个标签,说明列表框的功能。,例8.1 创建标签的例子,如图所示。,import java.awt.*; import java.applet.Applet; public class Label1 extends Applet public void init() Label label1=new Label(); Label label2=new Label(欢迎你使用标签!); Label label3=new Label(这是一个写标签的例子, Label.RIGHT); add(label1); add(label2); add(label3);

3、,2标签的构造方法,(1)Label() 该方法用来创建一个没有显示内容的对象。 (2)Label(String label) 该方法用来创建一个显示内容为label的对象。 (3)Label(String label, int alignment) 该方法除了用来创建一个显示内容为label的对象外,还设置了Label的对齐方式。 Label的对齐方式有三种,分别用Label类的三个常量LEFT、CENTER和RIGHT来表示左对齐、居中对齐和右对齐。,3标签的常用方法,(1)public int getAlignment() 返回当前的对齐方式。 (2)public String getT

4、ext() 返回当前显示的字符串。 (3)public void setAlignment(int alignment) 设置对齐方式。 (4)public void setText(String label) 设置显示的字符串。,8.1.2 按钮,1创建按钮 2按钮的构造方法 (1)Button() 创建一个没有标题的按钮。 (2)Button(String label) 创建一个有显示标题的按钮。 3按钮的常用方法 (1)public String getLabel() 返回按钮的显示标题。 (2)public void setLabel(String label) 设置按钮上的显示标题。

5、,8.1.3 选项框,选项框(Choice)又称下拉式列表。这种选项框一次只能显示一个选项,要改变被选中的选项,可以单击下箭头,从选项框中选择一个选项。,1创建选项框,例8.3 创建一个选项框的实例,如图所示。,import java.awt.*; import java.applet.Applet; public class Choice1 extends Applet public void init() Label label=new Label(选项框的例子); Choice c=new Choice(); c.addItem(北 京); c.addItem(上 海); c.addIt

6、em(天 津); c.addItem(南 京); c.addItem(郑 州); c.addItem(武 汉); add(c); add(label); ,2选项框的常用方法,(1)public void addItem(String item) 向选项框中加入选项item。 (2)public int countItem () 返回选项框中的选项个数。 (3)public String getItem(int index) 返回指定下标值的某个选项。 (4)public int getSelectIndex() 返回被选中的选项的下标值。 (5)public String getSelect

7、Item() 返回被选中的选项。 (6)public void select(int pos) 选择指定下标值的选项。 (7)public void select(String str) 选择指定的选项。,8.1.4 复选框和选项按钮,复选框(Checkbox)可以让用户作出多项选择。选项按钮(CheckboxGroup)又称单选框,是一组按钮,用户只能选择其中的一个。,1创建复选框,例8.4 创建复选框的例子,如图所示。,import java.awt.*; import java.applet.Applet; public class Check1 extends Applet final

8、 static int CITY_NUM=6; String city=北京,上海,天津,南京,郑州,武汉; Checkbox c=new Checkbox6; Label label=new Label(这是一个复选框的例子);,public void init() add(new Label(请选择中国的大城市:); for (int i=0; iCITY_NUM; i+) ci=new Checkbox(cityi); add(ci); add(label); ,例8.5 创建选项按钮的例子,如图所示。,import java.awt.*; import java.applet.Appl

9、et; public class Check2 extends Applet final static int CITY_NUM=6; String city=北京,上海,天津,南京,郑州,武汉; Checkbox radio=new Checkbox6; Label label=new Label(这是一个选项按钮的例子);,public void init() CheckboxGroup c=new CheckboxGroup(); add(new Label(请选择中国最大的城市:); for (int i=0; iCITY_NUM; i+) radioi=new Checkbox(ci

10、tyi, c, false); add(radioi); add(label); ,2复选框和选项按钮的构造方法,(1)Checkbox() 创建一个没有标签的复选框。 (2)Checkbox(北京) 创建一个有标签的复选框。 (3)CheckboxGroup() 创建选项按钮。,3复选框和选项按钮的常用方法,(1)public CheckboxGroup getCheckboxGroup() 返回选项按钮所属的复选框组。 (2)public String getLabel() 返回复选框或选项按钮的标签。 (3)public Boolean getState() 返回复选框或选项按钮是否被选

11、中。 (4)public void setCheckboxGroup(CheckboxGroup g) 设置选项按钮所属复选框组。 (5)public void setLabel(String label) 设置复选框或选项按钮的标签。 (6)public void setState(Boolean state) 设置复选框或选项按钮被选中。,8.1.5 列表框,列表框(List)可以使用户选择多个选项。列表框的所有选项都是可见的,如果选项数目超出了列表框可见区的范围,则列表框右边会出现一个滚动条。,例8.6 创建列表框、添加选项,如图所示。,import java.awt.*; import

12、 java.applet.Applet; public class List1 extends Applet List list1=new List(); List list2=new List(6, true); public void init() add(new Label(这是一个列表框的例子); list1.add(长江); list1.add(黄河); list1.add(淮河); add(list1);,list2.add(北京大学); list2.add(清华大学); list2.add(吉林大学); list2.add(复旦大学); list2.add(南开大学); list

13、2.add(天津大学); list2.add(南京大学); add(list2); ,8.1.6 文本框,文本框(TextField)用来接受用户键盘输入的单行文本信息。,1创建文本框,例8.7 创建两个不同的文本框,如图所示。,import java.awt.*; import java.applet.Applet; public class Text1 extends Applet public void init() add(new Label(用户名); add(new TextField(请输入用户名, 20); add(new Label(口令); add(new TextFiel

14、d(20); ,2文本框的构造方法,(1)TextField() 创建一个缺省长度的文本框。 (2)TextField(int columns) 创建一个指定长度的文本框。 (3)TextField(String text) 创建一个带有初始文本内容的文本框。 (4)TextField(String text, int columns) 创建一个带有初始文本内容并具有指定长度的文本框。,3文本框的常用方法,(1)public void setEchoChar(char c) 设定用户键入字符的回显字符,例如输入口令时可设定回显字符“*”来屏蔽。 (2)public void setText(S

15、tring t) 设定文本框的文本内容。,8.1.7 文本区,文本区(TextArea)可以显示大段的文本。,1创建文本区,例8.8 创建两个不同的文本区,如图所示。,import java.awt.*; import java.applet.Applet; public class TextAreaDemo extends Applet public void init() TextArea ta1=new TextArea(这里是文本区1,8,20); add(ta1); ta1.setEditable(false); TextArea ta2=new TextArea(这里是文本区2,8

16、,20); add(ta2); ta2.setEditable(true); ,2文本区的构造方法,(1)TextArea() 创建一个缺省大小的文本区。 (2)TextArea(int rows, int columns) 创建一个指定行和列数的文本区。 (3)TextArea(String text) 创建一个带有初始文本内容的文本区。 (4)TextArea(String text, int rows, int columns) 创建一个带有初始文本内容并具有指定行和列数的文本区。 (5)TextArea(String text, int rows, int columns, int s

17、crollbars) 在(4)的基础上添加滚动条。,3文本区的常用方法,(1)public void append(String str) 在文本区尾部添加文本。 (2)public void insert(String str, int pos) 在文本区指定位置插入文本。 (3)public void setText(String t) 设定文本区内容。 (4)public int getRows() 返回文本区的行数。 (5)public void setRows(int rows) 设定文本区的行数。 (6)public int getColumns() 返回文本区的列数。 (7)pu

18、blic void setColumns(int columns) 设定文本区的列数。 (8)public void setEditable(boolean b) 设定文本区的读写状态。,8.2 组件布局管理,组件的位置由容器的缺省布局管理器摆放,这样当组件较多时窗口就会显得凌乱。 如何控制组件的摆放位置呢? 本节介绍的布局管理器就是解决这个问题的。,8.2.1 顺序布局,顺序布局(FlowLayout)是最基本的一种布局,是面板(Panel)和它的子类Applet的缺省布局方式,前面介绍的例子都使用了缺省的顺序布局。Panel是一个容器,可以容纳多个组件,作为它的子类,Applet也具有容纳

19、组件的能力。 顺序布局指的是把组件一个接一个地从左到右顺序排列,一行排满后就转到下一行继续排列,直到把所有组件都显示出来。它将根据容器的大小随时调整它里面的组件的大小,包括高度和宽度,这个管理器不会约束组件的大小,而是允许他们获得自己的最佳大小。,8.2.2 边界布局,边界布局(BorderLayout)把容器(这里是Applet)分为五个区:北区、南区、东区、西区和中区。这几个区的分布规律是“上北下南,左西右东”,与地图的方位相同。组件可以指定自己放在那个区内,因为只有5个区,所以最多只能容纳5个组件,否则要采取其它布局方式。,例8.9 使用边界布局添加5个组件,如图所示。,import j

20、ava.awt.*; import java.applet.Applet; public class Border1 extends Applet Button bN, bS, bW, bE, bC; public void init() setLayout(new BorderLayout(); bN=new Button(北); bS=new Button(南); bE=new Button(东); bW=new Button(西); bC=new Button(中); add(North, bN); add(South, bS); add(East, bE); add(West, bW)

21、; add(Center, bC); ,8.2.3 卡片布局,卡片布局(CardLayout)将组件像卡片一样叠放起来,每次只显示一个。 例8.10 组件的卡片布局,如图所示。,import java.awt.*; import java.applet.Applet; public class Card1 extends Applet CardLayout card=new CardLayout(); public void init() setLayout(card); setFont(new Font(Arial, Font.PLAIN, 24); for (int i=1; i=5; i

22、+) add(String.valueOf(i), new Button(卡片号为:+i); card.show (this, String.valueOf(2); ,8.2.4 网格布局,网格布局(GridLayout)把容器(这里是Applet)区域分成若干个网格,每个网格可以放置一个组件,这种布局方式对数量众多的组件很合适。创建网格布局管理器时,可以给出网格的行数和列数。,例8.11 组件的网格布局,如图所示。,import java.awt.*; import java.applet.Applet; public class Grid1 extends Applet Button b1

23、, b2, b3, b4, b5, b6; public void init() setLayout(new GridLayout(3,3); / 设置为3行3列共9个网格 b1 = new Button(按钮1); b2 = new Button(按钮2); b3 = new Button(按钮3); b4 = new Button(按钮4); b5 = new Button(按钮5); b6 = new Button(按钮6);,add(new Label(label1); add(b1); add(b2); add(b3); add(new Label(); add(b4); add(b

24、5); add(b6); add(new Label(label2); ,8.2.5 面板的使用,面板(Panel)是一个无边框的容器,可以包容其它组件或另一个面板。使用面板的目的是为了分层次、分区域管理各种组件,通过各个面板的布局管理器对本身的组件进行管理,互不妨碍,这样就可以使布局更加合理和美观。,例8.12 用面板控制组件布局,如图所示。,import java.awt.*; import java.applet.Applet; public class Panel1 extends Applet public void init() setLayout(new BorderLayout

25、(); setForeground(Color.black); setFont(new Font(Arial,Font.PLAIN,20); add(North, new Label(我在 Applet 中,Label.CENTER);,Panel panel1=new Panel(); add(West, panel1); panel1.setBackground(Color.blue); panel1.setForeground(Color.red); panel1.setLayout(new BorderLayout(); panel1.add(East, new Button(东);

26、panel1.add(West, new Button(西); panel1.add(Center, new Label(我在 Panel1 中);,Panel panel2=new Panel(); add(East, panel2); panel2.setBackground(Color.green); panel2.setLayout(new BorderLayout(); panel2.add(North, new Label(我在 Panel2 中); panel2.add(South, new Button(我在 Panel2 中); ,面板和在面板上设置组件的常用方法:,Pane

27、l() 用缺省布局方式创建一个面板。 Panel(LayoutManager layout) 用指定布局方式创建一个面板。 public Component add(Component comp) 为容器添加一个组件。 public Component add(Component comp, int index) 将组件添加到队列的指定位置。 public void add(Component comp, Object constraints) 按照限制条件添加组件。 public void remove(Component comp) 去除指定组件。 public void setFont(

28、Font f) 设定组件的字体。 public void setSize(Dimension d) 设定组件的宽和高。 public void setVisible(boolean b) 设定组件可见。 public void setLocation(int x, int y) 设定组件的位置。 public void setBackground(Color c) 设定组件的背景色。 public void setForeground(Color c) 设定组件的前景色。,public void setBounds(int x, int y, int width, int height) 设定

29、组件的位置和大小。 public void setName(String name) 设定组件的名称。 public String getName() 返回组件的名称。 public int getX() 返回组件的x坐标。 public int getY() 返回组件的y坐标。 public int getHeight() 返回组件的高。 public int getWidth() 返回组件的宽。 public void paint(Graphics g) 画出容器。 public void update(Graphics g) 用背景色清除组件,设定画笔为前景色,调用paint方法重画组件

30、。 public void repaint() 立即调用组件的update方法。,8.2.6 手工布局,例8.13 手工放置组件,如图所示。,import java.awt.*; import java.applet.Applet; public class No1 extends Applet Choice c=new Choice (); Button b1=new Button(Button1); Button b2=new Button(Button2); Button b3=new Button(Button3);,public void init() setLayout(null)

31、; c.addItem(Item1); c.addItem(Item2); c.addItem(Item3); add(c); c.setBounds(80,80,100,20); add(b1); b1.setBounds(20,20,50,30); add(b2); b2.setBounds(100,20,50,30); add(b3); b3.setBounds(200,60,50,50); ,8.3 事件处理方法,对按钮等组件进行单击操作,都没有反应,怎么让组件响应用户让它完成的任务呢? 下面来解决这个问题。,8.3.1 事件与事件处理方法,在图形用户界面中,程序和用户的交互是通过组件

32、响应各种事件来实现的。例如,用户单击了一个按钮,意味着发生了按钮的单击事件;选中下拉框中的一个选项,意味着发生了一个选项事件。每当一个事件发生,Java虚拟机就会将事件的消息传递给程序,由程序中的事件处理方法对事件进行处理。如果没有编写事件处理方法,程序就不能和用户交互,上面的程序因为没有编写事件处理方法,所以虽然Java虚拟机通知程序发生了按钮单击事件,但程序中因为没有相应的事件处理方法,所以事件被忽略了。,8.3.2 Java的事件处理机制,能产生事件的组件叫做事件源,如按钮。如果希望对单击按钮事件进行处理,可给事件源(按钮)注册一个事件监听器(如包含按钮的容器),如同签订了一个委托合同,

33、当事件源发生事件时,事件监听器就代替事件源对发生的事件进行处理,这就是所谓的委托事件处理机制。 事件监听器可以是一个自定义类或其它容器,如定义的类S1、Applet、Canvas、Frame等,它们本身并没有事件处理方法,所以需要使用事件接口中的事件处理方法来创建事件处理方法。因此,事件监听器必须实现事件接口的方法。,8.3.3 事件处理实例,1单击按钮事件处理 例8.14 本程序在Applet上创建了一个按钮和一个标签。用鼠标单击按钮时,会听到一声响声。如图所示。,import java.awt.*; import java.awt.event.*; import java.applet.A

34、pplet; public class Beep extends Applet implements ActionListener / 实现动作事件监听接口 public void init() add(new Label(按一下按钮可听到响声!, Label.CENTER);,Button btn=new Button(按钮); add(btn); btn.addActionListener (this); / 注册事件源的动作监听者 public void actionPerformed(ActionEvent e) /进行事件处理的方法 Toolkit.getDefaultToolkit

35、 ().beep(); / 动作事件发生时作出的反应 ,事件处理的步骤:,(1)引入系统事件类包。 (2)在定义类的同时声明实现单击事件监听器接口。 (3)在方法中调用事件源对象的addActionListener注册事件监听器方法,给事件源对象注册事件监听器。 (4)实现actionPerformed事件接口方法。,单击事件类ActionEvent有一些常用方法:,(1)public String getActionCommand() 可返回事件源的标签。 (2)public Object getSource() 返回产生事件的对象引用。 (3)public int getModifiers

36、 返回事件发生时功能控制键的状态,它们可能是功能键常数SHIFT_MASK、CTRL_MASK、ALT_MASK。如果getModifiers的返回值不等于这些常数中的任何一个,说明发生事件时没有按住功能控制键不放。,2选项事件处理,例8.15 复选框和选项按钮的事件处理,如图所示。,import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class ItemDemo extends Applet implements ItemListener TextArea area=new TextAre

37、a(6,30); String City=北京,上海,天津,南京,武汉; Checkbox cb=new Checkbox5; Checkbox radio=new Checkbox5;,public void init() add(new Label(这是一个选项事件例子); add(area); add(new Label( 请选择中国的大城市:); for(int i=0; i5; i+) cbi=new Checkbox(Cityi); add(cbi); cbi.addItemListener(this); CheckboxGroup cbGroup=new CheckboxGrou

38、p(); add(new Label(请选择中国最大的城市:);,Button btn=new Button(按钮); add(btn); btn.addActionListener (this); / 注册事件源的动作监听者 public void actionPerformed(ActionEvent e) /进行事件处理的方法 Toolkit.getDefaultToolkit ().beep(); / 动作事件发生时作出的反应 ,for(int i=0; i5; i+) radioi=new Checkbox(Cityi,cbGroup,false); add(radioi); rad

39、ioi.addItemListener(this); public void itemStateChanged(ItemEvent e) area.append (你选择的是+e.getItem ()+n); ,3文本动作事件处理,例8.16 文本的动作事件处理,如图所示。,import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class TextDemo1 extends Applet implements ActionListener TextArea Area=new TextArea

40、(6,40); TextField tf1=new TextField(10); TextField tf2=new TextField(10); public void init() setFont(new Font(Arial,Font.PLAIN,12); add(Area); add(new Label(用户名); add(tf1);,add(new Label(电话); add(tf2); tf1.addActionListener(this); tf2.addActionListener(this); public void actionPerformed(ActionEvent

41、e) if (e.getSource()=tf1) Area.append(用户名:+tf1.getText()+n); else Area.append(电 话:+tf2.getText()+n); ,4卡片布局的事件处理,例8.17 添加卡片按钮来翻看卡片组件,如图所示。,import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class CardDemo1 extends Applet implements ActionListener CardLayout card=new CardLa

42、yout(); public void init() Button cb=new Button6; setLayout(card);,setFont(new Font(Arial,Font.PLAIN,24); for (int i=1;i=5;i+) cbi=new Button(卡片号为:+i); add(String.valueOf(i),cbi); cbi.addActionListener(this); card.show(this,String.valueOf(1); public void actionPerformed(ActionEvent e) card.next(this

43、); ,卡片布局提供的常用方法:,(1)public void first(Container parent) 显示第一张卡片。 (2)public void last(Container parent) 显示最后一张卡片。 (3)public void next(Container parent) 显示下一张卡片。 (4)public void previous(Container parent) 显示上一张卡片。 (5)public void show(Container parent, String name) 显示指定的卡片。,5实现多个事件接口,例8.18 在窗口中用鼠标拖动画线。运

44、行结果如图所示。,import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class DrawLine extends Applet implements MouseListener, MouseMotionListener int x1, y1, x2, y2; public void init() addMouseListener(this); addMouseMotionListener(this); ,public void paint(Graphics g) g.drawLine(x1, y1, x2, y2); public void mousePressed(MouseEvent e) / 记录起点坐标 x1=e.getX(); y1=e.getY(); ,public void mouseCli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论