1、1/第17讲 图形用户界面教学目标 掌握AWT高级组件 掌握利用AWT绘图滚动条Scrollbar 滚动条(Scrollbar)是AWT中常用的组件,方便用户拖拽滚动条来设置数值或滚动画面。下表列出了类Scrollbar的构造方法与方法。构 造 方 法主 要 功 能Scrollbar()构造一个新的垂直滚动条构造一个新的垂直滚动条Scrollbar(int orientation)构造一个具有指定方向的新滚动条构造一个具有指定方向的新滚动条Scrollbar(int orientation,int value,int visible,int minimum,int maximum)构造一个新的
2、滚动条,它具有指定的构造一个新的滚动条,它具有指定的方向、初始值、可视量、最小值和最方向、初始值、可视量、最小值和最大值大值方 法主 要 功 能void addAdjustmentListener(AdjustmentListener l)添加指定的调整侦听器添加指定的调整侦听器,以接收来自,以接收来自此滚动条的此滚动条的 AdjustmentEvent AdjustmentEvent 实例实例int getMaximum()获得此滚动条的最大值获得此滚动条的最大值int getMinimum()获得此滚动条的最小值获得此滚动条的最小值int getOrientation()返回此滚动条的方向
3、返回此滚动条的方向int getValue()获得此滚动条的当前值获得此滚动条的当前值boolean getValueIsAdjusting()如果该值作为用户执行操作的结果正如果该值作为用户执行操作的结果正处于改变过程中处于改变过程中,则返回,则返回 truetruevoid setMaximum(int newMaximum)设置此滚动条的最大值设置此滚动条的最大值void setMinimum(int newMinimum)设置此滚动条的最小值设置此滚动条的最小值void setOrientation(int orientation)设置此滚动条的方向设置此滚动条的方向void setV
4、alue(int newValue)将此滚动条的值设置为指定值将此滚动条的值设置为指定值void setValues(int value,int visible,int minimum,int maximum)设置此滚动条的四个属性值:设置此滚动条的四个属性值:valuevalue、visibleAmountvisibleAmount、minimum minimum 和和 maximummaximum滚动条说明 滚动条的方向可以设置成水平或垂直,Scrollbar类分别用HORIZONTAL与VERTICAL两个常量来表示。Java为滚动条提供了adjustmentEvent类进行事件处理,使
5、用的是AdjustmentListener接口。接口提供了一个唯一的方法:void adjustmentValueChanged(adjustmentEvent e)adjustmentValueChanged()可接收adjustmentEvent类的对象,这个对象正是当滚动条滚动时触发adjustmentEvent而传递给监听器的。例Ex9_25滚动条组件的使用程序分析:当拖动滚动条时,程序分析:当拖动滚动条时,AdjustmentEvent事件将被触发,事件将被触发,adjustmentValueChanged()将执行。通过滚动条对象的将执行。通过滚动条对象的getValue()方方法
6、取得滚动条的当前值,根据这个值设置标签字体的大小。法取得滚动条的当前值,根据这个值设置标签字体的大小。对话框Dialog 对话框(Dialog)是一种特殊的窗口,通常会利用它来处理一些简单的交互信息。Dialog与Frame类都是继承自Window类,它们均可放置AWT的组件。下表列出了类Dialog的构造方法与方法。构 造 方 法主 要 功 能Dialog(Window owner)构造一个初始时不可见构造一个初始时不可见,无模式的,无模式的对话对话框,框,带有空标题和指定的所有者框架带有空标题和指定的所有者框架Dialog(Window owner,String title)构造一个初始时
7、不可见、无模式的构造一个初始时不可见、无模式的对话对话框框,带有指定的所有者,带有指定的所有者 dialog dialog 和标题和标题Dialog(Window owner,String title,boolean modal)构造一个初始时不可见的构造一个初始时不可见的 Dialog,Dialog,带有带有指定的所有者指定的所有者 dialogdialog、标题和模式、标题和模式Dialog(Window owner,String title,boolean modal,GraphicsConfiguration gc)构造一个初始时不可见的构造一个初始时不可见的 DialogDialog
8、,带,带有指定的所有者有指定的所有者 dialogdialog、标题、模式、标题、模式和和 GraphicsConfigurationGraphicsConfiguration方 法主 要 功 能void addNotify()通过将此通过将此 Dialog Dialog 连接到本机屏连接到本机屏幕资源幕资源,从而使其成为可显示的从而使其成为可显示的String getTitle()获得获得 dialog dialog 的标题的标题boolean isModal()指出指出 dialog dialog 是否为有模式的是否为有模式的boolean isResizable()指出此指出此 dial
9、og dialog 是否可以由用户是否可以由用户调整大小调整大小boolean isUndecorated()指出此指出此 dialog dialog 是否未装饰是否未装饰void setTitle(String title)设置设置 Dialog Dialog 的标题的标题对话框常用方法例:Ex9_26对话框的使用程序分析:运行程序,将得到一个窗口。当按下窗口的关闭按程序分析:运行程序,将得到一个窗口。当按下窗口的关闭按钮时,将弹出一个对话框,如图所示。按下对话框中的关闭按钮,钮时,将弹出一个对话框,如图所示。按下对话框中的关闭按钮,窗口将关闭。当按下取消按钮时,将返回到初始状态。窗口将关闭
10、。当按下取消按钮时,将返回到初始状态。程序中,可能会触发两个类的事件,一个是按下窗口关闭按钮程序中,可能会触发两个类的事件,一个是按下窗口关闭按钮所触发的所触发的WindowEventWindowEvent事件,关于这个事件,程序中使用了由事件,关于这个事件,程序中使用了由WindowAdapterWindowAdapter类派生出来的内部类类派生出来的内部类WinLisWinLis类对象来监听。另一个类对象来监听。另一个事件是对话框上的按钮按下时所触发的事件是对话框上的按钮按下时所触发的ActionEventActionEvent事件。因为事件。因为Ex9_26Ex9_26类由类由Actio
11、nListenerActionListener接口实现,所以第二个事件可以由接口实现,所以第二个事件可以由frmfrm窗口对象来监听。窗口对象来监听。菜单的设计 一般的大型程序总是离不开菜单。在Java中,一个完整的菜单是由3个菜单栏类所创建,它们分别是菜单栏(MenuBar)、菜单(Menu)、菜单项(MenuItem)。其中,MenuBar和MenuItem都继承自MenuComponent类,Menu继承自MenuItem类。方 法主 要 功 能MenuBar()创建新的菜单栏创建新的菜单栏Menu add(Menu m)将指定的菜单添加到菜单栏将指定的菜单添加到菜单栏void dele
12、teShortcut(MenuShortcut s)删除指定的菜单快捷方式删除指定的菜单快捷方式Menu getHelpMenu()获取该菜单栏上的帮助菜单获取该菜单栏上的帮助菜单Menu getMenu(int i)获取指定的菜单获取指定的菜单int getMenuCount()获取该菜单栏上的菜单数获取该菜单栏上的菜单数void remove(int index)从此菜单栏移除指定索引处的菜单从此菜单栏移除指定索引处的菜单void remove(MenuComponent m)从此菜单栏移除指定的菜单组件从此菜单栏移除指定的菜单组件void setHelpMenu(Menu m)将指定的菜
13、单设置为此菜单栏的帮助将指定的菜单设置为此菜单栏的帮助菜单菜单菜单栏(MenuBar)方方 法法主主 要要 功功 能能Menu()构造具有空标签的新菜单构造具有空标签的新菜单Menu(String label)构造具有指定标签的新菜单构造具有指定标签的新菜单MenuItem add(MenuItem mi)将指定的菜单项添加到此菜单将指定的菜单项添加到此菜单void add(String label)将带有指定标签的项添加到此菜单将带有指定标签的项添加到此菜单void addSeparator()将一个分隔线或连字符添加到菜单中将一个分隔线或连字符添加到菜单中MenuItem getItem(
14、int index)获取此菜单的指定索引处的项获取此菜单的指定索引处的项int getItemCount()获取此菜单中的项数获取此菜单中的项数void insert(MenuItem menuitem,int index)将菜单项插入到此菜单的指定位置将菜单项插入到此菜单的指定位置void insert(String label,int index)将带有指定标签的菜单项插入到此菜单将带有指定标签的菜单项插入到此菜单void insertSeparator(int index)在指定的位置插入分隔符在指定的位置插入分隔符void remove(int index)从此菜单移除指定索引处的菜单
15、项从此菜单移除指定索引处的菜单项void remove(MenuComponent item)从此菜单移除指定的菜单项从此菜单移除指定的菜单项void removeAll()从此菜单移除所有项从此菜单移除所有项菜单(Menu)构 造 方 法主 要 功 能MenuItem()构造具有空标签且没有键盘快捷方式的新构造具有空标签且没有键盘快捷方式的新菜单项菜单项MenuItem(String label)构造具有指定的标签且没有键盘快捷方式构造具有指定的标签且没有键盘快捷方式的新菜单项的新菜单项MenuItem(String label,MenuShortcut s)创建具有关联的键盘快捷方式的菜单
16、项创建具有关联的键盘快捷方式的菜单项菜单项(MenuItem)方方 法法主主 要要 功功 能能void addActionListener(ActionListener l)添加指定的操作侦听器,以从此菜单项接收添加指定的操作侦听器,以从此菜单项接收操作事件操作事件void deleteShortcut()删除与此菜单项关联的任何删除与此菜单项关联的任何MenuShortcut对象对象AccessibleContext getAccessibleContext()获取与此菜单项关联的获取与此菜单项关联的AccessibleContextString getLabel()获取此菜单项的标签获取此
17、菜单项的标签MenuShortcut getShortcut()获取与此菜单项关联的获取与此菜单项关联的MenuShortcut对象对象void setEnabled(boolean b)设置是否可以选择此菜单项设置是否可以选择此菜单项void setLabel(String label)将此菜单项的标签设置为指定标签将此菜单项的标签设置为指定标签void setShortcut(MenuShortcut s)设置与此菜单项关联的设置与此菜单项关联的MenuShortcut对象对象菜单项(MenuItem)创建菜单栏 创建一个菜单栏,首先必须创建一个MenuBar对象。通过调用窗口对象的set
18、MenuBar()方法,将菜单栏加入到指定的窗口。再通过MenuBar对象的add()方法,将Menu对象加入到菜单中,然后将MenuItem菜单项通过add()方法加入到各菜单中。由于Menu类是继承自MenuItem类的,所以也可以将一个Menu()对象通过add()方法加入到菜单中,这就形成了子菜单。菜单栏的设计看起来很复杂,但是事件处理却很简单,它只会触发ActionEvent事件。具体的使用方法跟以前的按钮事件相同。例:Ex9_27菜单栏设计示例程序分析:同按钮事件的处理一样,通过程序分析:同按钮事件的处理一样,通过getSourcegetSource()()方法获取方法获取事件源,
19、根据事件源来设置窗口内事件源,根据事件源来设置窗口内LabelLabel对象的字体。程序看起来对象的字体。程序看起来很长,实际上仔细分析并不困难,请读者自行分析程序。很长,实际上仔细分析并不困难,请读者自行分析程序。AWT的绘图 AWT除了提供的基本组件来创建图形,还提供了Graphics类供用户绘制图形。在一个窗口中,可以通过Graphics类提供的getGraphics()方法来获取绘图区域。取得绘图区域之后,就可以使用Graphics类提供的各种绘图方法来绘制图形了。比如,想在窗口中绘制一个矩形,下面的语句就可以实现。Graphics g=getGraphics();g.drawRect
20、(30,60,140,40);第一条语句是取得窗口的绘图区,第二条语句是绘制长方形。Graphics类提供了许多丰富的方法,同学们可以参考API熟悉这些方法。例:Ex9_28 AWT绘图示例 程序分析:程序分析:AWT提供了一个自发性提供了一个自发性的的paint()方法。方法。paint()方法在下方法在下列情况发生时,会自动运行:列情况发生时,会自动运行:1当新建的窗口显示在显示器上,当新建的窗口显示在显示器上,或从隐藏变成显示时;或从隐藏变成显示时;2从缩小图标还原之后;从缩小图标还原之后;3正在改变窗口的大小时。正在改变窗口的大小时。paint()方法的格式是方法的格式是:public
21、 void paint(Graphics g)可以将可以将Graphics对象传给对象传给paint()方法,这样一来,编写在方法,这样一来,编写在paint()里面的程序代码便可在绘图区内绘制图形了。上面的绘里面的程序代码便可在绘图区内绘制图形了。上面的绘图代码就可以进行改装,将绘制矩形的代码放在图代码就可以进行改装,将绘制矩形的代码放在paint()方法里方法里面,程序通过调用面,程序通过调用paint()进行绘图。进行绘图。Swing组件库 AWT设计的初衷是支持开发小应用程序的简单用户界面。但是,AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格
22、等基本元素。此外,人们使AWT适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构就成为其致命的弱点。Swing产生的主要原因就是AWT不能满足图形化用户界面发展的需要。Swing概述 Swing组件几乎都是轻量组件 Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级(light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。Swing采用了一种MVC的设计范式,即“模型-视图-控制”(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。Swing比AWT提供
23、了更多的组件,这些组件都在javax.swing包中定义,按功能分类有下面几种。1顶层容器组件(Top-Level Containers)JFrame,JDialog,JApplet,JSplitPane,JTabbedPane,JToolbar2特殊用途容器组件(Special-Purpose Containers)JInteralFrame,JLayeredFrame,JRootPane3基本组件(Basic Controls)JButton,JComboBox,JList,JMenu,JSlider,JTextField,JTextArea4信息显示组件(Uneditable Infor
24、mation Displays)JLabel,JProgressBar,JTooltip5格式化信息输入组件(Editable Displays of Formatted Information)JColorChooser,JFileChooser,JTable,JTreeSwing概述Swing基本组件的使用 向JFrame中添加组件的方法与AWT中向Frame中添加组件略有不同。JFrame中含JRootPane容器组件又内含contentPane容器组件,只能在contentPane容器中添加组件。通常,使用JFrame中的getContentPane()方法,获取对contentPan
25、e对象的引用 例Ex9_29 Swing基本组件的使用从本例可以看出,从本例可以看出,Swing比比AWT提供了更多的组件,提供了更多的组件,而且每个组件的方法属性也而且每个组件的方法属性也比比AWT中的组件丰富。中的组件丰富。JTree类 树状组件(JTree)提供了庞大的API,是Swing中功能最大的一个组件。几乎可以在树状组件上做任何动作,但是操作起来也很复杂。幸好,Swing提供了一个缺省的树状组件处理模式。当你按下按钮之后,新的子树状组件便会加到目前所选取的节点上。例:Ex9_30 JTree类的使用程序运行结果如图所示。运行时,首先生成一程序运行结果如图所示。运行时,首先生成一个
26、带滚动条的面板个带滚动条的面板treeScroller,然后通过,然后通过Swing提提供的缺省的树状组件供的缺省的树状组件DefaultMutableTreeNode生生成多个节点。成多个节点。JTable类 和树状组件一样,表格(JTable)组件也非常的庞大。特别是程序通过JDBC访问数据时,常常会运用表格来显示界面。例:Ex9_31 JTable类的使用程序分析:程序中使用了构造方法程序分析:程序中使用了构造方法JTable(Object rowData,Object columnNames)生成一个二维表格。其中,生成一个二维表格。其中,rowDate数组是用来显示的值,数组是用来显示的值,columnNames数组表示是数组表示是二维数组的列名称。二维数组的列名称。