}
}
} catch (FileNotFoundException e1) { System.err.println(\} catch (IOException e2) { e2.printStackTrace(); }
static String deleteComments( String s ) //去掉以//开始的注释 { if( s==null ) return s; int pos = s.indexOf( \ if( pos<0 ) return s; return s.substring( 0, pos ); }
第10章 图形用户界面
1.试列举出图形用户界面中你使用过的组件。 答:常用的容器组件如:边框窗体(Frame)、对话框(Dialog)、面板(Panel)、及滚动面板(ScrollPane)等。常用的非容器组件,如按钮(Button),标签(Label),文本类组件(TextField及TextArea),复选按钮(Checkbox),单选按钮组(CheckboxGroup),Choice(下拉列表),List(列表),滚动条(Scrollbar),画布(Canvas)等。
2.Java中常用的布局管理各有什么特点?
答:常用的布局管理有5种,即FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout,它们的特点如下:
FlowLayout是容器Panel和它的子类Applet缺省使用的布局管理器,它将将其中的组件按照加入 的先后顺序从左向右排列,一行排满之后就下转到下一行继续。
BorderLayout是容器Frame和Dialog缺省使用的布局管理器,它把容器内的空间简单地划分为东、西、南、北、中五个区域。
CardLayout的容器表面上可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就像一叠―扑克牌‖每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。
GridLayout是使用较多的布局管理器,其基本布局策略是把容器的空间划分成若干 行乘若干列的网格区域,组件就位于这些划分出来的小格中。
在GridBagLayout中,可以为每个组件指定其包含的网格个数,可以保留组件原来的大小,可以以任意顺序随意加入容器的任意位置,从而可以真正自由地安排容器中每个组件的大小和位置。
3.简述Java的事件处理机制。
答:在Java中通过实现事件监听器(Eventistener)来实现对事件的处理。事件监听器是一些事件的接口,这些接口是 java.awt.AWTEventListener的子类。接口中含有相关的方法,每个方法中可以编程来处理相关的事件。
每个界面对象在需要处理某种事件时,先进行事件的注册。注册的过程就是将界面对象与事件监听器联系在一起的过程。
4.什么是事件源?什么是监听者?
答:事件源是指发出事件的界面对象。监听者是指处理这些事件的对象,它实现了一些相关事件处理方法的接口,在一定意义上监听者是具体处理这些事件的程序。
5.列举java.awt.event包中定义的事件类,并写出它们的继承关系。
答:在java.awt.event包中有一系列的事件类,如KeyEvent及MouseEvent等。这些事件类都是从AWTEvent类派生而来的。事件类之间的继承关系如下图所示。
6.列举GUI的各种标准组件和它们之间的层次继承关系。
答:组件(Component)分为容器(Container)类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮(Button),标签(Label),文本类组件TextComponent等等。
容器又分为两种顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,顶层容器的类是Window,Window的重要子类是Frame和Dialog。非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等, Panel的重要子类是Applet。其中,Panel和Applet的容器都是无边框的;ScrollPanel一组是可以自动处理滚动操作的容器;Window,Frame,Dialog和FileDialog是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。
AWT组件的分类如下图所示:
Label, TextComponent,......?Button,???Frame?Component??Window???Dialog?Container?Panel,ScrollPane?,.......??
组件间的继承关系,如下图所示:
7.Component类有何特殊之处?其中定义了哪些常用方法?
答:Component类是所有组件和容器的抽象父类,其中定义了一些每个容器和组件都可能用到的方法,较常用的有:
(1)public void add(PopupMenu popup):在组件上加入一个弹出菜单,当用户用鼠标右键单击组件时将弹出这个菜单。
(2)public Color getBackground():获得组件的背景色。 (3)public Font getFont():获得组件使用的字体。
(4)public Color getForeground():获得组件的前景色。
(5)public Graphics getGraphics():获得在组件上绘图时需要使用的Graphics对象。
(6)public void repaint(int x,int y,int width,int height):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域。
(7)public void setBackground(Color c):设置组件的背景色。
(8)public voidsetEnabled(boolean b):设置组件的使能状态。参数b为真则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件。
(9)public void setFont(Font f):设置组件使用的字体。
(10)public void setSize(int width,int height):设置组件的大小。
(11)public void setVisible(boolean b):设置组件是否可见的属性。参数b为真时,组件在包括它的容器可见时也可见;否则组件不可见。
(12)public void setForeground(Color c):设置组件的前景色。 (13)public void requestFocus():使组件获得注意的焦点。
8.将各种常用组件的创建语句、常用方法、可能引发的事件、需要注册的监听者和监听者需要重载的方法综合在一张表格中画出。
答:常用的组件与事件的关系如下表所示: Act Adj Cmp 组 件 Button Y Y Canvas Y Checkbox Y CheckboxMenuItem Choice Y Component Y Comtainer Y Dialog Y Frame Y Label Y List Y Y MenuItem Y Panel Y Scrollbar Y Y ScrollPane Y TextArea Y TextField Y Y Window Y 注: Act: Action 行动事件 Adj: Adjustment调整 Cmp: Component组件事件 Cnt: Container容器事件 Foc: Focus 焦点事件 Itm: Item 条目事件 Key: Key键盘事件
Mou: Mouse 鼠标事件 MM: Mouse Motion鼠标移动事件 Txt: Text 文本事件 Win: Window 窗口事件
Cnt Y Y Y Y Y Y Foc Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Itm Y Y Y Y Key Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Mou Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y MM Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Txt Y Y Win Y Y Y
9.编写Applet包括一个标签、一个文本框和一个按钮,当用户单击按钮时,程序把文本框中的内容复制到标签中。
答:见程序。
10.编写Applet程序,画出一条螺旋线。 答:见程序。import java.awt.*; import java.awt.event.*; import java.applet.*;
public class Ex10_10 extends Applet { public void paint(Graphics g){ double w = getSize().width/2; double h = getSize().height/2; g.setColor( Color.blue ); for( double th =0; th double x = r * Math.cos( th ) + w; double y = r * Math.sin( th ) + h; g.drawLine( (int)x, (int)y, (int)x, (int)y); } } } 11.编写Applet程序,用paint()方法显示一行字符串,Applet包含两个按钮―放大‖和―缩小‖,当用户单击―放大‖时显示的字符串字体放大一号,单击―缩小‖时显示的字符串字体缩小一号。 答:见程序。import java.applet.*; import java.awt.*; import java.awt.event.*; public class Ex10_11 extends Applet { Button btn1 = new Button(\放大\ Button btn2 = new Button(\缩小\ public void init() { setLayout( new FlowLayout() ); add( btn1 ); add( btn2 ); btn1.addActionListener( new BtnActionAdapter() ); btn2.addActionListener( new BtnActionAdapter() ); } private int fontSize = 12; public void paint(Graphics g){ double w = getSize().width/2; double h = getSize().height/2; g.setColor( Color.blue ); g.setFont( new Font( \宋体\ g.drawString( \文字的大小\ } class BtnActionAdapter implements ActionListener { public void actionPerformed( ActionEvent e ) { if( e.getSource() == btn1 ) fontSize += 2; if( e.getSource() == btn2 ) fontSize -= 2; if( fontSize <= 5 ) fontSize = 5; Ex10_11.this.repaint(); } } } 12.编写Applet程序,包含三个标签,其背景分别为红、黄、蓝三色。 答:见程序。import java.applet.*; import java.awt.*; import java.awt.event.*; public class Ex10_12 extends Applet { Label lb1 = new Label(\红\ Label lb2 = new Label(\黄\ Label lb3 = new Label(\蓝\ public void init() { setLayout( new FlowLayout() ); add( lb1 ); add( lb2 ); add( lb3 ); lb1.setBackground( Color.red ); lb2.setBackground( Color.yellow ); lb3.setBackground( Color.blue ); } } 13.使用Checkbox标志按钮的背景色,使用CheckboxGroup标志三种字体风格,使用Choice选择字号,使用List选择字体名称,由用户确定按钮的背景色和前景字符的显示效果。 答:见程序。import java.applet.*; import java.awt.*; import java.awt.event.*; public class Ex10_13 extends Applet implements ActionListener { Checkbox chkBack = new Checkbox(\背景为黄色\ CheckboxGroup cbgStyle = new CheckboxGroup(); Choice chcSize = new Choice(); List lstName = new List(4, false); Button btnOk = new Button(\确定\ public void init() { add( chkBack ); add(new Checkbox(\常规\ add(new Checkbox(\粗体\ add(new Checkbox(\斜体\ chcSize.add( \ chcSize.add( \