890 likes | 1.11k Views
Java 面向对象程序设计. 第 6 章 图形用户界面. 第 6 章 图形用户界面. 6.1 Java 抽象窗口工具集 6.2 AWT 组件 6.3 容器 6.4 组件布局管理 6.5 事件处理 6.6 颜色和字体 6.7 颜色和字体 6.8 Swing 简介. 6.1 Java 抽象窗口工具集.
E N D
Java面向对象程序设计 第 6 章 图形用户界面
第6章 图形用户界面 6.1 Java抽象窗口工具集 6.2 AWT组件 6.3 容器 6.4 组件布局管理 6.5 事件处理 6.6 颜色和字体 6.7 颜色和字体 6.8 Swing简介
6.1 Java抽象窗口工具集 • 图形用户界面(Graphics User Interface , GUI),是指用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面画面生动、操作简单,深受广大用户的喜爱和欢迎,已经成为目前几乎所有应用软件的既成标准。所以学习设计和开发图形用户界面,是应用软件开发员必修的一课。
AWT(Abstract Window Toolkit,抽象窗口工具集)是Java语言提供的用户界面设计工具。AWT的核心思想是把GUI看作是由一系列的组件(Componetn)构成,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮、一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器才可以显示出来。容器(Container)实际是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其他组件和容器的功能。 • AWT由java.awt包提供,该包中有许多用来设计用户界面的类和接口,用户在JavaApplication或Applet中进行GUI设计。
Button Label Component Object Panel Container Window Frame CheckBox Dialog Choice AWT组件相关类的层次关系如图6.1所示。 Applet
设计和实现用户图形界面主要包括以下三个方面:设计和实现用户图形界面主要包括以下三个方面: • 设计组件(Component):包括设计Java.awt包中提供的组件和用户自定义的组件; • 指定布局(Layout):根据设计需要排列容器内各组件的位置; • 设计响应事件(Event)。
6.2 AWT组件 • 组件是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。组件一般作为一个对象放置在容器内,组件通过容器的add方法加入到容器中。 • 抽象类Component作为Java GUI组件的共同父类,它规定了所有GUI组件的基本特性,该类中定义的方法实现了作为一个GUI部件所应具备的基本功能,
6.2.1 标签、文本框和命令按钮 1、标签 标签的功能是显示单行的字符串,可在屏幕上显示一些提示性,说明性的文字。如在文本框的旁边加上一个标签,说明文本框的功能。 • 标签的构造方法有以下三种: (1) Label() 该方法用来创建一个没有显示内容的对象; (2) Label(String str)该方法用来创建一个显示内容为str的对象 (3)Label(String str, int alignment)该方法除了用来创建一个显示内容为Label的对象外,还设置了Label的对齐方式。Label的对齐方式有LEFT、CENTER和RIGHT来表示左对齐、居中和右对齐。
标签的常用方法有: • int getAlignment()返回当前的对齐方式; • String getName()返回当前对齐的名字; • String getText()返回当前对象显示的文本; • void setAlignment(int align)设置对齐方式; • void setText(String str)设置标签对象显示的内容;
2、文本框 • Java中用于处理文本的基本组件有两种:单行文本框TextField和多行文本区域TextArea,用来接受用户的键盘输入。 • TextField的构造方法及常用方法有: (1) TextField()创建一个默认长度的文本框; (2) TextField(int columns)创建一个指定长度的文本框; (3) TextField(String text)创建一个带有初始文本内容的文本框; (4) TextField(String text, int columns)创建个带有初始文本内容并具有指定长度的文本框;
2、文本框 (5) void setText(String text)设定文本框的内容; (6) void setEchoChar(char c)设定用户输入字符的回显字符,例如输入用户口令时可设定回显字符为’*’来屏蔽; (7) String getText()获取文本框的内容; (8) void setEditable(boolean e)设置文本框的可编辑性,默认为可编辑;
TextArea类的构造方法及常用方法有: • TextArea()创建一个默认行数和列数的文本区; • TextArea(int rows, int columns)创建一个rows行,columns列的文本区; • TextArea(String text)创建一个带有初始文本内容的文本区; • TextArea(String text,int rows, int columns)创建文本区,初始字符串为text,行数为rows,列数为columns。 • TextArea(String text,int rows,int clumns,int scrollbar),在上面文本区的基础上增加滚动条,scrollbar取值可以是:SCROLLBARS_HORIZONTAL_ONLY(仅有水平滚动条)、SCROLLBARS_VERTICAL_ONLY(仅有垂直滚动条)、SCROLLBARS_BOTH(垂直,水平滚动条都有)、SCROLLBARS_NONE(没有滚动条);
6 void setText(String text)设置文本区的内容; 7 String getText()获取文本区的文本; 8 void append(String str)在文本区的尾部添加文本; 9 void insert(String str,int position)在指定位置插入文本; 10 void setRows(int rows)设定文本框的行数; 11 int getRows()返回文本区的行数; 12 void setEditable(boolean b)设定文本区的可编辑状态。
3、按钮 Button类的构造方法及常用方法: (1) Button()创建一个没有标题的按钮; (2) Button(String label)创建一个有文字标题的按钮; (3) String getLabel()返回按钮的显示标题; (4) void setLabel(String label)设置按钮上显示的标题。
6.2.2 单选框和复选框 复选框(Checkbox)用于设置多重选择,可以让用户作出多项选择。 单选框又称为选项按钮,是一组按钮,用户只能从中选择一个。 复选框和选项按钮的构造方法和主要方法如下 : (1) Checkbox()创建个没有标签的复选框; (2) Checkbox(“北京”)创建一个标签为“北京“的复选框; (3) CheckboxGroup()创建选项按钮。 (4) String getLabel()返回复选框或单选按钮的标签; (5) CheckboxGroup getCheckboxGroup()返回单选按钮的复选框组; (6) void setCheckboxGroup(CheckboxGroup g)设置单选按钮所属的选项框组; (7) boolean getState()返回复选框或单选按钮的选中状态; (8) void setState(Boolean state)设置复选框或单选框的选中状态;
6.2.3下拉列表框和列表框 1、下拉列表框 下拉列表框(Choice)是图形界面中提供选项的常用组件,用户可以看到下拉列表框中的第一个选项和它旁边的箭头按钮,单击箭头按钮时,下拉列表框打开,用户可以在列表框中选择其他选项进行更改。其常用的方法有: (1) void addItem(String item)向列表框中添加选项item; (2) int countItem()返回列表框中的选项个数; (3) String getItem(int index)返回指定下标值的某个选项; (4) int getSelectedIndex() 返回被选中的选项的下标值; (5) String getSelectedItem()返回被选中的选项;
(6) void select(int index)选择指定下标值的选项; (7) void select(String item)选择指定的选项; (8) void insert(String item, int index)在下拉列表框中index索引处插入名称为item的选项; (9) void remove(int index)删除下拉列表框中index索引处的选项; (10) removeAll()删除下拉列表框中所有选项。
2、列表框 • 列表框(List)提供了多个文本选项,所有选项都是可见的,如果选项数目超出了列表框可见的范围,则列表框右边会出现个滚动条,同时,列表框支持多项选择。其构造方法与常用方法有: (1) List()创建一个空列表框; (2) List(int rows)创建一个具有rows行的空列表框; (3) List(int rows, boolean multiple)创建个rows行的空列表框,multiple值为true,则支持多重选择,否则只支持单项选择,默认为false; (4) void delItem(int index)删除列表框中index索引处的选项内容;
(5) String getItem(int index)获取指定位置index索引处的选项内容; (6) String[] getItems()获取所有选项内容; (7) int getItemCount()获取列表框中共有多少个选项 (8) void replaceItem(String item, int index)将index处位置的选项换成item; (9) void setMultipleMode(boolean b)b为true则允许多项选择,否则不允许。
例6.3 列表框应用实例 import java.awt.*; import java.applet.Applet; public class TestList extends Applet { public void init(){ Label label1=new Label("请选择系别:"); Label label2=new Label("中国名牌大学:"); Choice c=new Choice(); c.add("计算机系"); c.add("商学系"); c.add("艺术系"); c.add("机电系"); c.addItem("信息管理系"); c.insert("法律系",2); c.select(2);
List l=new List(4); l.add("北京大学"); l.add("清华大学"); l.add("复旦大学"); l.add("浙江大学"); l.add("中国海洋大学"); l.setMultipleMode(true); add(label1); add(c); add(label2); add(l); } } 程序运行结果如右图所示:
6.3容器 • 容器是用来组织其他界面成份和元素的单元。一般说来一个应用程序的图形用户界面对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面元素,这些界面元素本身也可以是另外一个容器,这个容器再进一步包含它的界面元素,依次类推就构成一个复杂的图形界面系统。
容器的主要作用和特点如下: • 容器有一定范围:一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记; • 容器有一定的位置:这个位置可以是屏幕四角的绝对位置,也可以是相对于其他窗口边框的相对位置; • 容器中可以包含其他的许多界面成分和元素:当容器被打开显示时,它上面的所有元素也同时显示出来,当容器被关闭和隐藏时,它所包含的元素也一起被隐藏; • 容器可以按一定的规则来物理地安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。
Java中GUI提供两种主要的容器类型:Panel类和Window类。这两个类都是抽象类。Java中GUI提供两种主要的容器类型:Panel类和Window类。这两个类都是抽象类。 • Window类是可自由停泊的顶层窗口,Window类的两个重要子类是框架类(Frame)和对话框类(Dialog),这两个类者有边框,并且都可以移动、放大、缩小和关闭功能的容器;Panel类是可作为容器容纳其他组件的非顶层容器,它不能独立存在,必须被添加到其他容器中(如Window或Applet)。
从Component类继承的下述成员方法: • public setLocation(int x,int y):移动当前组件到一个新的位置; • public setSize(int width,int height):重新设置组件大小; • public setBounds(int x,int y,int width,int height):移动并重置当前组件大小。
6.3.1 Frame类 • 抽象Window类不能实例化,实际程序中经常使用的是其子类Frame。Frame对象显示效果是一个窗口,带有标题,可以由用户重置其大小。在其构造方法中通过String参数指定窗口标题,Frame对象默认尺寸为0×0像素且不可见,可使用setSize()方法设置窗口大小,使用setVisible(true)方法使之变为可见。Frame默认的布局管理器是BorderLayout,可使用setLayout()方法改变其默认布局管理器。
例: import java.awt.*; public class TestFrame { public static void main(String[] args) { Frame f=new Frame("My Frame Test"); f.setSize(200,150); f.setBackground(Color.BLUE ); f.setVisible(true); } }
6.3.2 Panel类 • Panel类可以容纳其他组件,在程序中经常用于布局和定位,它可以采用与所在容器不同的布局管理器,Panel对象默认的布局管理器是FlowLayout,也可使用setLayout()方法改变其默认布局管理器。
例: import java.awt.*; public class TestPanel { public static void main(String[] args) { Frame f=new Frame("My Frame with Panel"); Panel p=new Panel(); f.setSize(180,120); f.setBackground(Color.BLUE ); f.setLayout(null); //取消布局管理器 p.setSize(120,60); p.setBackground(Color.GREEN ); f.add(p); f.setVisible(true); } }
本讲小结: • 本讲首先介绍了AWT(抽象窗口工具集)的概念,接着讲述了Java中的基本组件:标签、文本框、命令按钮、单选框、复选框、下拉列表框和列表框,最后介绍了Frame类和Panel类两个容器类的使用。
6.4 组件布局管理 • 为了使我们生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器这个工具来管理组件在容器中的位置,而不使用直接设置组件位置和大小的方式。每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,会就调用其对应的布局管理器。 • Java语言中包含的容器布局管理器有:FlowLayout、BorderLayout、GridLayout和CardLayout。
6.4.1 FlowLayout布局管理器 • FlowLayout(顺序布局)是最基本的一种布局,是Panel面板及其子类Applet的默认布局方式,前面介绍的例子都使用了默认的顺序布局。这种布局方式将组件依次逐行定位,行内从左到右顺序排列,一行排满后就转到下一行继续排列,直到把所有的组件都显示出来。FlowLayout布局默认对齐方式为居中对齐,不改变组件的大小,按组件原有尺寸显示组件。 • 在顺序布局方式下,由于功能有限,不能很好地控制组件的排列,所以常用在组件较少的情况下,组件较多时,可以使用容器的setLayout方法改变组件布局方式。
6.4.2 BorderLayout布局管理器 • BorderLayout(边界布局)是Window、Frame和Dialog的默认布局管理器。BorderLayout把容器分为5个区:North(北区)、South(南区)、East(东区)、West(西区)和Center(中区)五个区域,其方位依据“上北下南,左西右东”的规则,组件只能添加到指定的区域。如不指定组件的加入部位,则默认加入到Center区域。每个区域只能加入一个组件,如加入多个,则先前加入的组件会被遗弃。 • 与FlowLayout不同,在使用BorderLayout布局管理器容器中,组件尺寸也被布局管理器强行控制,即组件与其所在区域的尺寸相同。当BorderLayout型布局容器的尺寸发生变化时,其中各组件的相对位置保持不变,组件的尺寸会随所在区域进行缩放调整。
例: import java.awt.*; import java.applet.Applet; public class TestBorderLayout extends Applet { Button bN,bS,bW,bE,bC; public void init(){ BorderLayout layout=new BorderLayout(); setLayout(layout); bN=new Button("North"); bS=new Button("South"); bW=new Button("West"); bE=new Button("East"); bC=new Button("Center"); add(bN,"North"); add(bS,"South"); add("West",bW); add("East",bE); add("Center",bC); } }
6.4.3 GridLayout布局管理器 • GridLayout(网格布局)管理器将容器区域划分成规则的若干矩形网格,每个单元格区域大小相同,每个网格可以放置一个组件,组件添加到网格中时 ,先从左到右添满一行后换行,再从上到下。与BorderLayout布局类型一样,GridLayout型布局中的组件大小被布局管理器强行控制,与网格同等大小,当容器尺寸发生变化时,其中的组件相对位置不变,但大小发生变化。创建网格布局管理器时,可以给出网格的行数和列数。
例: import java.awt.*; import java.applet.Applet; public class TestGridLayout extends Applet { Button b1,b2,b3,b4,b5,b6,b7,b8; public void init(){ setLayout(new GridLayout(3,4)); b1=new Button("button1"); b2=new Button("button2"); b3=new Button("button3"); b4=new Button("button4"); b5=new Button("button5"); b6=new Button("button6"); b7=new Button("button7"); b8=new Button("button8"); add(new Label("第一格")); add(b1); add(b2); add(b3); add(b4); add(new Label("label")); add(b5); add(b6); add(b7); add(b8); } }
6.4.4 CardLayout布局管理器 • CardLayout(卡片布局)管理器能够帮助用户处理两个以至更多的组件成员共享同一显示窨,将组件像卡片一样前后依次排列,这种布局在一张卡片中只显示一个组件,因此需要使用某种方法翻阅这些卡片。
使用CardLayout布局常用到以下三个方法: • first():显示布局设置为CardLayout的容器中的第一张卡片; • last():显示布局设置为CardLayout的容器中的最后一张卡片; • next():显示当前卡片的下一张卡片
例: import java.awt.*; import java.applet.Applet; public class TestCardLayout extends Applet { CardLayout card=new CardLayout(); //先创建一个卡片布局管理器对象 public void init(){ setLayout(card); //设定容器的布局方式 setFont(new Font("隶书",Font.ITALIC +Font.BOLD ,26)); //设置字体 for(int i=1;i<6;i++){ add(String.valueOf(i),new Label("卡片号为:"+i)); } //card.show(this,String.valueOf(3)); //显示卡片号为3的卡片 //card.show(this,"1"); //显示第1张卡片 card.last(this ); //显示最后一张卡片,即卡片号为5的卡片 card.next(this); //显示下一张卡片 } }
6.4.5 手工布局 • Java还允许用户取消容器的默认布局,手工放置各个组件,这种方法比较灵活。如: import java.awt.*; import java.applet.Applet; public class TestLayoutNull extends Applet { Label lbl=new Label("手工布局的例子"); TextField txt=new TextField(20); Button btn=new Button("test"); Button ok=new Button("确定"); public void init(){ setLayout(null);//取消默认布局,采用手工布局 setBackground(Color.BLUE ); add(lbl); lbl.setBounds(20,20,100,30); lbl.setBackground(Color.YELLOW ); add(txt); txt.setBounds(20,60,60,20); add(btn); btn.setBounds(100,60,30,20); add(ok); ok.setBounds(80,100,30,20); } }