《第11章 高级组件GUI设计》由会员分享,可在线阅读,更多相关《第11章 高级组件GUI设计(100页珍藏版)》请在金锄头文库上搜索。
1、第11章 高级组件GUI设计,11.1 界面布局管理11.2 键盘事件(KeyEvent) 11.3 鼠标事件(MouseEvent)11.4 窗口与面板11.5 菜单设计11.6 对话框设计,11.1 界面布局管理,Java语言中提供的布局编辑类,其目的正是为了将组件排列在容器中合适的位置上。 Java.awt包中共定义了五种布局编辑类,分别是FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout。每个布局编辑类对应一种布局策略,这五个类都是java.lang.Object类的直接子类。 Javax.swing包中定义了4种布局
2、编辑类,分别是BoxLayout、ScrollPaneLayout、ViewportLayout和OverlayLayout。 下面将讨论FlowLayout,BorderLayout,CardLayout,GridLayout和BoxLayout几种常用的布局策略。,11.1.1 FlowLayoutjava.FlowLayout类是java.lang.Object类的直接子类。FlowLayout的布局策略是将遵循这种布局策略的容器中的组件按照加入的先后顺序从左向右排列,当一行排满之后就转到下一行继续从左至右排列,每一行中的组件都居中排列。 FlowLayout是Applet缺省使用的布局
3、编辑策略。FlowLayout类有三个构造方法,分别是: (1) FlowLayout( ) :用于创建一个版面设定为居中对齐、各组件的水平及垂直间隔为5个像素点的FlowLayout类的对象。,(2) FlowLayout(int align) :用于创建一个FlowLayout类的对象,版面按给出的align值对齐,各组件的水平及垂直间隔为5个像素。align的值可以是FlowLayout.LEFT(左对齐)FlowLayout.RIGHT(右对齐)FlowLayout.CENTER(居中对齐)(3) FlowLayout(int align,int hgap,int vgap) :用于创
4、建一个既指定对齐方式,又指定组件间间隔的FlowLayout类的对象。参数align作用及取值同上;参数hgap指定组件间的水平间隔;参数vgap指定各组件间的垂直间隔。间隔单位为像素点。,11.1.2 BorderLayout java.BorderLayout类是java.lang.Object类的直接子类。BorderLayout布局策略是把容器内的空间划分为东、西、南、北、中五个区域(如图11.1所示)。这五个区域分别用字符串常量East、West、South、North、Center表示。向这个容器内每加入一个组件都应该指明把它放在容器的哪个区域中。分布策略:分布在北部和南部区域的组
5、件将横向扩展至占据整个容器的长度;分布在东部和西部的组件将伸展至占据容器剩余部分的全部宽度;最后剩余的部分将分配给位于中央的组件。,注意:如果某个区域没有分配组件,则其他组件可以占据它的空间。例如,如果北部没有分配组件,则西部和东部的组件将向上扩展到容器的最上方;如果西部和东部没有分配组件,则位于中央的组件将横向扩展到容器的左右边界。BorderLayout是JApplet的缺省布局策略。,BorderLayout类有两个构造方法,分别是BorderLayout( ):创建一个各组件间的水平、垂直间隔为0的BorderLayout类的对象;BorderLayout(int hgap, int
6、vgap):创建一个各组件间的水平间隔为hgap、垂直间隔为vgap的BorderLayout类的对象。BorderLayout仅指定了五个区域的位置,如果容器中需要加入的组件超过五个,就必须使用容器的嵌套或改用其他的布局策略。,【示例程序c11_1.java】 使用BorderLayout布局策略在五个位置分别加入了四个按钮和一个标签,当点击按钮时,标签的文本就是按钮的标签的文本。,图11.1 程序c11_1的运行结果,11.1.3 CardLayout CardLayout的版面布局方式是将每个组件看成一张卡片,如同扑克牌一样将组件堆叠起来,而显示在屏幕上的每次只能是最上面的一个组件,这个
7、被显示的组件将占据所有的容器空间。用户可通过表11.1所示的方法选择使用其中的卡片。CardLayout类有两个构造方法,分别是CardLayout( ):使用默认(间隔为0)方式创建一个CardLayout( )类对象CardLayout(int hgap,int vgap):使用hgap指定的水平间隔和vgap指定的垂直间隔创建一个CardLayout( )类对象。,表11.1 CardLayout类的常用成员方法,【示例程序c11_2.java】 使用CardLayout的布局在容器中放入三个按钮,显示第二个按钮。注意:在程序中调用容器的add( )方法可将组件加入到容器中。例如语句ad
8、d(a,bt1);中的字符串“a是为组件分配的字符串名字,分配的目的是为了让布局编辑器根据这个名字调用显示这个组件。,图11.2,11.1.4 GridLayout 如果界面上需要放置的组件较多,且这些组件的大小又基本一致时,例如计算器、遥控器的面板,使用GridLayout布局策略是最佳的选择。GridLayout的布局策略是把容器的空间划分为若干行、若干列的网格区域,而每个组件按添加的顺序从左向右、从上向下地占据这些网格。,GridLayout类的三个构造方法如下:(1) GridLayout( ):按默认(1行1列)方式创建一个GridLayout布局。(2) GridLayout(in
9、t rows,int cols):创建一个具有rows行、cols列的GridLayout布局。(3) GridLayout(int rows,int cols,int hgap,int vgap):按指定的行数rows、列数cols、水平间隔hgap和垂直间隔vgap创建一个GridLayout布局。,【示例程序c11_3.java】 使用GridLayout的布局,在容器中放入4个按钮。,图11.3 程序c11_3的运行结果,11.1.5 BoxLayoutBoxLayout是swing所提供的布局管理器,继承关系如下: java.lang.Object javax.swing.BoxLa
10、youtBoxLayout只有两种排列方式,一种是水平,另一种是垂直。我们可以使用BoxLayout所提供的两个常量X_AXIS、Y_AXIS来指明组件在容器中是水平还是垂直排列的。BoxLayout类与Box类结合,可以提供多样化的布局。通常的做法是使用若干个Box容器,由于Box容器的默认布局是BoxLayout,而且只能使用这个布局,因此,每一个Box容器中组件的排列方式也只能按水平或垂直方向排列。,1BoxLayout和Box的构造函数创建BoxLayout类的对象的构造方法是:BoxLayout(Container target,int axis)target是容器对象;axis指明
11、target中组件的排列方式,其值可为表示水平排列的BoxLayout.X_AXIS,或为表示垂直排列的BoxLayout.Y_AXIS。,Box这个容器默认的布局是BoxLayout,而且只能使用这个布局,否则编译时就会产生错误。由于BoxLayout是以水平或垂直方式排列的,因此,当我们要创建一个Box容器时,就必须指定Box容器中组件的排列方式是水平还是垂直的。Box的构造函数为: Box(int axis)参数axis,用以指定Box中的组件是按水平还是按垂直方式排列的。值可以用BoxLayout.X_AXIS或BoxLayout.Y_AXIS指定可使用Box类提供的两个方法creat
12、HorizontalBox( )与creatVerticalBox( )来指定。,2BoxLayout类和Box类的常用成员方法,BoxLayout类的常用成员方法,Box类的常用成员方法,Box类的常用成员方法,为方便布局管理,Box类还提供了4种透明组件Glue、Strut、Rigid和Filler,可以将这些透明组件插入其他组件的中间,使这些组件产生分开的效果。这4种透明组件的作用是:Glue:将Glue两边的组件挤到容器的两端。Strut:将Strut两端的组件按水平或垂直方向指定的大小分开。Rigid:可以设置二维的限制,将组件按水平或垂直方向指定的大小分开。 Filler:不仅可以
13、设置二维的限制,将组件按水平或垂直方向指定的大小分开,而且还可以设置最大、较佳、最小的长宽大小。,构造方法:Box.Filler(Dimensionmin, Dimensionpref, Dimensionmax) 使用给定的大小范围创建形状的构造方法。,3使用BoxLayout时需要注意的事项(1) 当组件按BoxLayout布局排列好后,不管窗口缩小或放大都不会变动。(2) 当使用水平排列方式时,若放进去的组件不等高,则系统将会使所有的组件与最高组件等高。(3) 当放在同一行的组件超出容器的宽度时,系统不会自动换行,需要用户自行处理。,【示例程序c11_4.java】 使用BoxLayou
14、t布局,将6个组件按结果要求排列。,图11.4 程序c11_4的运行结果,11.2 键盘事件(KeyEvent),当用户使用键盘进行操作时则会产生KeyEvent事件。处理KeyEvent事件的监听者对象是可以实现KeyListener接口的类,或者是继承KeyAdapter的子类。这些对象使用组件的 addKeyListener 方法注册,以接收此类事件。在KeyListener这个接口中有如下三个事件:keyPressed(KeyEvent e) 键盘按键被按下的事件。keyReleased(KeyEvent e) 键盘按键被放开的事件。keyTyped(KeyEvent e) 按键被敲击
15、的事件。,按下和释放键盘上的键会导致(依次)生成以下键事件: KEY_PRESSED KEY_TYPED(只在可生成有效 Unicode 字符时产生) KEY_RELEASED KEY_TYPED事件,输入 Unicode 字符时生成此类事件,它们被认为是发现字符输入的最佳方式。对于不生成 Unicode 字符的键是不会生成键入键事件的(如动作键等)。通过 getKeyChar 方法可获得键入的字符。KEY_PRESSED和KEY_RELEASED事件,只要按下或释放键就生成这些事件,它们是发现不生成字符输入的键(如动作键等)的惟一方式。通过 getKeyCode 方法可指出按下或释放的键,该
16、方法返回一个虚拟键码。,KeyEvent类中的常用方法有:(1) public char getKeyChar( ):返回引发键盘事件的按键对应的Unicode字符。如果这个按键没有Unicode字符与之对应,则返回KeyEvent类的一个静态常量KeyEvent.CHAR_UNDEFINED。KEY_PRESSED 和 KEY_RELEASED 事件不用于报告字符输入。因此,可以保证此方法返回的值只对 KEY_TYPED 事件有意义。例如:shift + a 的 KEY_TYPED 事件返回值 A。,(2) public int getKeyCode() :返回与此事件中的键关联的整数 keyCode。对于 KEY_TYPED 事件,该 keyCode 为 VK_UNDEFINED。例如: 按键shift 的 KEY_PRESSED 事件返回值 VK_SHIFT (3) public static String getKeyText(intkeyCode) :返回描述 keyCode 的 String。例如:按键shift的 KEY_PRESSED 事件中KeyEvent.getKeyText(e.getKeyCode()返回为“shift”,